Python3 学习笔记13_函数的参数_20180305
2018-03-05 15:24
826 查看
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数 * #**************************************************** print ("--------------------分割线------------------") #============ # 函数的参数 #============ ### 位置参数 ### def power1(x): return x * x print( power1(5) ) # 25 # 对于power1(x)函数,参数x就是一个位置参数。 # 以上是计算x的平方,如果我们需要计算x的三次方、四次方等等。 # 可以把power1(x)修改为power2(x,n),用来计算x的n次方 def power2(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s print( power2(2, 4) ) # 16 # 修改后的power2(x, n)函数有两个位置参数:x 和 n。 ### 默认参数 ### # 因经常计算x的平方,所以完全可以把第二个参数n的默认值设为2 def power3(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s print( power3(5) ) # 25 print( power3(5, 2) ) # 25 print( power3(5, 3) ) # 125 print ("--------------------分割线------------------") ''' 默认参数设置要点: 1. 必选参数在前,默认参数在后,否则pyhon解释器会报错 2. 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面 变化小的参数就可以作为默认参数。 ''' def enroll(name, gender, age=6, city='beijing'): print( 'name:', name ) print( 'gender:', gender ) print( 'age:', age ) print( 'city:', city ) # age, city 都使用默认参数值 enroll('tom','F') ''' 执行结果: name: tom gender: F age: 6 city: beijing ''' print ("--------------------分割线------------------") # 只有city使用默认参数值 enroll('Bob','M', 7) ''' 执行结果 name: Bob gender: M age: 7 city: beijing ''' print ("--------------------分割线------------------") # 可以不按顺序提供默认参数,但必须把参数名加上 enroll('Adam', 'M', city='HaiNan', age=9) ''' 执行结果 name: Adam gender: M age: 9 city: HaiNan ''' print ("--------------------分割线------------------") #### 默认参数最大的坑,要注意 def add_end(L=[]): L.append('END') return L print( add_end() ) # ['END'] print( add_end() ) # ['END', 'END'] print( add_end() ) # ['END', 'END', 'END'] print ("--------------------分割线------------------") ''' Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认 参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容, 则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了 定义默认参数要牢记一点:默认参数必须指向不变对象!!! ''' # 修改上面例子 def add_end1(L=None): if L is None: L = [] L.append('END') return L print( add_end1() ) # ['END'] print( add_end1() ) # ['END'] ''' 不变对象的好处: 因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于 修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象 不需要加锁,同时读一点问题都没有,在编写程序时,尽量设计成不变对象 ''' print ("--------------------分割线------------------") ### 可变参数 ### # 定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个 # *号。在函数内部,参数numbers接收到的是一个tuple。调用函数时,可以 # 传入任意个参数,包括0个参数。 # a+b+c+...... def calc( *number ): sum = 0 for n in number: sum = sum + n return sum print( calc() ) # 0 print( calc(1,2,3) ) # 6 print( calc(1,2,3,4) ) # 10 # 如果已经有一个list或tuple nums = [10, 20, 30] print( calc(nums[0], nums[1], nums[2]) ) # 60 # 这种写法可行,但太繁琐,所以python允许你在list或tuple前面加一个 # *号,把list或tuple的元素变成可变参数传进去: print( calc(*nums) ) # 60 # *nums表示把nums这个list的所有元素作为可变参数传进去。 print ("--------------------分割线------------------") ### 关键字参数 ### ''' 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动 组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数, 这些关键字参数在函数内部自动组装为一个dict。 ''' def person(name, age, **keyword): print('name:',name, 'age:',age, 'others:', keyword) # 只传入必选参数 person( 'miss', 30 ) # name: miss age: 30 others: {} # 传入一个或多个关键字参数 person( 'miss', 30, city='beijing', gender='M' ) # name: miss age: 30 others: {'city': 'beijing', 'gender': 'M'} # 先组装一个dict,然后把该dict转换为关键字参数传进去 dict_temp = {'city':'beijing', 'gender':'M'} person( 'miss', 30, city=dict_temp['city'], gender=dict_temp['gender'] ) # name: miss age: 30 others: {'city': 'beijing', 'gender': 'M'} # dict调用可以简化写法 person( 'miss', 30, **dict_temp ) # name: miss age: 30 others: {'city': 'beijing', 'gender': 'M'} ''' **dict_temp表示把这个dict的所有key-value用关键字参数传入到函数 的**keyword参数,keyword将获得一个dict,注意获得的dict是dict_temp的 一份拷贝,对keyword的改动不会影响到函数外的dict_temp。 ''' print ("--------------------分割线------------------") ''' 关键字参数作用:可以扩展函数的功能,比如,在函数person中,保证接收 到name和age这两个参数,但是,如果调用者愿意提供更多的参数,也能收到。 ''' ### 命名关键字参数 ### ''' 对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数,如果 我们要限制关键字参数的名字,就可以用命名关键字参数 如关键字参数**keyword不同,命名关键字参数需要一个特殊分隔符*,*后面 的参数被视为命名关键字参数 命名关键字参数必须传入参数名,与位置参数不同,不传入参数名调用报错。 ''' # 只接受city 和 gender作为关键字参数 def person1(name, age, *, city, gender): print( name, age, city, gender ) person1('Tom', 25, city='hainan', gender='M') # Tom 25 hainan M # 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不 # 再需要一个特殊分隔符*了 def person2(name, age, *args, city, gender): print(name, age, args, city, gender) # 两个普通位置参数,两个可变参数,两个命名关键字参数 person2('Tom', 25, 'aa','bb',city='hainan', gender='M') # Tom 25 ('aa', 'bb') hainan M # 命名关键字参数可以有缺省值,简化调用 def person3(name, age, *, city='Beijing', job): print(name, age, city, job) person3('Jack', 25, job='teacher') # Jack 25 Beijing teacher ###参数组合### ''' 在python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和 命名关键字参数,这5种参数都可以组合使用。但是必须注意,参数定义的顺序 必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。 虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的 可理解性很差 ''' # 包含若干种参数 def func(a, b=0, *args, **keyword): print( a, b, args, keyword ) ''' 小结: Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传 入非常复杂的参数。 默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误! 要注意定义可变参数和关键字参数的语法: *args是可变参数,args接收的是一个tuple; **kw是关键字参数,kw接收的是一个dict。 以及调用函数时如何传入可变参数和关键字参数的语法: 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再 通过*args传入:func(*(1, 2, 3)); 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通 过**kw传入:func(**{'a': 1, 'b': 2})。 使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好 使用习惯用法。 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则 定义的将是位置参数。 '''
相关文章推荐
- python学习笔记-(13)python中的函数参数传递
- python函数参数学习笔记
- Python中函数参数设置及使用的学习笔记
- Python学习笔记7-把函数当参数传递、指定可变参数
- Python中函数参数设置及使用的学习笔记
- Python学习笔记——函数参数
- 廖雪峰python函数的参数学习笔记
- Python学习笔记7-把函数当参数传递、指定可变参数
- Python学习笔记(10)-函数-函数定义、调用、参数、返回值、嵌
- Python学习笔记(四)-- 函数中的参数传递
- Python学习笔记之一: 函数参数
- 初学Python的学习笔记2----dist字典,set集合,声明函数,函数参数
- Python学习笔记5:函数参数详解
- 【Python】学习笔记十三:函数的参数对应
- 【Python】学习笔记——-3.3、函数的参数
- python学习笔记12(函数三): 参数类型、递归、lambda函数
- python学习笔记——函数可变参数处理
- Python学习笔记--《简明Python教程》之默认函数参数和关键参数函数
- python学习笔记12(函数三): 参数类型、递归、lambda函数
- Python学习笔记7-把函数当参数传递、指定可变参数