在学习python函数的时候,函数本身的定义和调用并不是很复杂,但是函数的参数类型和用法的确有些复杂。在此做一个小结,加深理解。
python参数的定义
def sayhello(person): print("hi {0},nice to meet you!".format(person)) print('nice to meet you too!') sayhello('tom') hi tom,nice to meet you! nice to meet you too!
python参数的类型
# python函数的定义和调用语法 def func_name(parameter1,parameter2,...): function_body #调用 func_name(value1,value2,...)
# 使用默认参数 def student(name,age,gender='male'): if gender == 'male': print("{0} is {1} years old, and he is a good student.".format(name,age)) else: print("{0} is {1} years old, and she is a good student.".format(name,age)) # 调用上述函数student student('wangxiaoli',20,'female') student('zhangdayong',22) wangxiaoli is 20 years old, and she is a good student. zhangdayong is 22 years old, and he is a good student.
# 使用关键字参数 def func_name(name='tom',age=20,addr='no addr'): print('i am a student.') print("my name is {0}, and i am {1} years old, i come from {2}.".format(name,age,addr)) # 调用 # 关键字参数调用时,参数的位置是不重要的 func_name(name='wangmeili',addr='china',age=23) # 关键字参数也属于特殊的默认参数 func_name() i am a student. my name is wangmeili, and i am 23 years old, i come from china. i am a student. my name is tom, and i am 20 years old, i come from no addr. # 同普通参数的混用 # 如果关键字参数函数中还有普通的位置参数,则在函数定义时,需要把普通参数放在前面 # 调用的时候,普通参数,也必须放在前面 # 否者就会报下面的定义错误 def func_name(age,name='tom',addr='no addr'): print('i am a student.') print("my name is {0}, and i am {1} years old, i come from {2}.".format(name,age,addr)) file "<ipython-input-13-0663557d1e59>", line 5 def func_name(name='tom',age,addr='no addr'): ^ syntaxerror: non-default argument follows default argument # 调用错误 # 强调位置参数必须放在前面 def func_name(name,age=20,addr='no addr'): print('i am a student.') print("my name is {0}, and i am {1} years old, i come from {2}.".format(name,age,addr)) # 错误的调用方法 func_name(age=22,'jack',addr='china') file "<ipython-input-16-e8faf29fa701>", line 7 func_name(age=22,'jack',addr='china') ^ indentationerror: unindent does not match any outer indentation level
语法结构 def func_name(*args): function_body 按照tuple的使用方法定义*args,得到传入的参数 调用: func_name(p1,p2,p3,...) #参数名args是约定俗称的写法,前面必须加* # 使用收集参数 # 函数模拟学生的自我介绍,介绍的内容不确定 # args可一看作是一个元组tuple def instrostu(*args): print("hello everyone,allow me to introduce myself:") print(type(args)) for params in args: print(params) # 调用 # 相当于把提供的实参,装入到args中 instrostu('wangmeili',18,'nanjing','single') instrostu('tom') hello everyone,allow me to introduce myself:: <class 'tuple'> wangmeili 18 nanjing single hello everyone,allow me to introduce myself:: <class 'tuple'> tom
#语法结构 def func_name( **kwargs): function_body #调用: func_name(p1=v1,p2=v2,...) # 关键字收集参数 # 自我介绍 def stu(**kwargs): print('hello everyone,allow me to introduce myself: ') print(type(kwargs)) # 对于字典的访问 for key,value in kwargs.items(): print(key,'--->',value) # 调用 stu(name='wangmeili',age=19,add='nanjing',lover='gavin',work='teacher') print('*' * 30) stu(name='tom') print('*' * 30) stu() hello everyone,allow me to introduce myself: <class 'dict'> name ---> wangmeili age ---> 19 add ---> nanjing lover ---> gavin work ---> teacher ****************************** hello everyone,allow me to introduce myself: <class 'dict'> name ---> tom ****************************** hello everyone,allow me to introduce myself: <class 'dict'>
# 混合参数使用案例 # 自我介绍 def student(name,age=20,*args,addr='no addr',hobby='none',**kwargs): print('hello,大家好!') print("我叫{0},我今年{1}岁,我来自{2}".format(name,age,addr)) if hobby == 'none': print('我目前没有啥特别的喜好') else: print("我的爱好是{0},有兴趣大家可以一起玩呀!".format(hobby)) print('-' * 30) for i in args: print(i) print('-' * 30) for k,v in kwargs.items(): print(k,'--->',v) print('*' * 30) # 调用 student('猪上树',22,'足球','篮球',addr='江苏南京',hobby='桌球',lover='王美丽',hate='张大熊') student('张大熊',25,'但是我是一个环保爱好者','也是一名公益事业爱好者',addr='南邮') hello,大家好! 我叫猪上树,我今年22岁,我来自江苏南京 我的爱好是桌球,有兴趣大家可以一起玩呀! ------------------------------ 足球 篮球 ------------------------------ lover ---> 王美丽 hate ---> 张大熊 ****************************** hello,大家好! 我叫张大熊,我今年25岁,我来自南邮 我目前没有啥特别的喜好 ------------------------------ 但是我是一个环保爱好者 也是一名公益事业爱好者 ------------------------------ ******************************
# 上例函数可以改写为如下,将*args位置提前 def student1(name,*args,age=20,addr='no addr',hobby='none',**kwargs): print('hello,大家好!') print("我叫{0},我今年{1}岁,我来自{2}".format(name,age,addr)) if hobby == 'none': print('我目前没有啥特别的喜好') else: print("我的爱好是{0},有兴趣大家可以一起玩呀!".format(hobby)) print('-' * 30) for i in args: print(i) print('-' * 30) for k,v in kwargs.items(): print(k,'--->',v) print('*' * 30) student1('大熊',1,3,4,5,age=22,hobby='篮球',x=1,y=2,z=3) hello,大家好! 我叫大熊,我今年22岁,我来自no addr 我的爱好是篮球,有兴趣大家可以一起玩呀! ------------------------------ 1 3 4 5 ------------------------------ x ---> 1 y ---> 2 z ---> 3 ******************************
# 调用list到 *args # def stu1(*args): print('hahahhahahha') for i in args: print(i) ll = ['wangmeili',22,'shanghai'] # 这种调用方式,直接将整个list打印出来 stu1(ll) print('---------------') # 如果要将list中的每个元素都打印出来,就需要解包 stu1(*ll) hahahhahahha ['wangmeili', 22, 'shanghai'] --------------- hahahhahahha wangmeili 22 shanghai
# 调用dict到 **args def stu2(**kwargs): print('hahahhahahha') for k,v in kwargs.items(): #print(type(k)) #print(type(v)) print(k,'>>>',v) d = {'name':'wangmeili','age':'22','addr':'shanghai'} # 此时若要将字典当作实参传递给kwargs,就必须先进性解包 stu2(**d) print('-------------') # 不解包传参 stu2(d) # 不解包传参,函数会把传入的字典名称d,当作一个位置参数 hahahhahahha name >>> wangmeili age >>> 22 addr >>> shanghai ------------- --------------------------------------------------------------------------- typeerror traceback (most recent call last) <ipython-input-82-09f0a7d3879b> in <module>() 13 14 # 不解包传参 ---> 15 stu2(d) typeerror: stu2() takes 0 positional arguments but 1 was given
def test(*args,**kwargs): print('args = ',args) print('kwargs = ',kwargs) print('--------------') test(1,2,3,4) test(a=1,b=2,c=3) test(1,2,3,4,a=1,b=2,c=3) test('a',none,3,a='qq',b=2,c=9) args = (1, 2, 3, 4) kwargs = {} -------------- args = () kwargs = {'a': 1, 'b': 2, 'c': 3} -------------- args = (1, 2, 3, 4) kwargs = {'a': 1, 'b': 2, 'c': 3} -------------- args = ('a', none, 3) kwargs = {'a': 'qq', 'b': 2, 'c': 9} --------------
# 将一串字符转变为一个元组tuple def aas(x,*args): print(x) print(args) aas(1,2,3,4,5,6,7,'a','aa','scd') 1 (2, 3, 4, 5, 6, 7, 'a', 'aa', 'scd') # 使用**args 创建一个字典 def gen_dict(**kwargs): return kwargs dict1 = gen_dict(a=1,b=2,c=3,name='jack') print(dict1) {'a': 1, 'b': 2, 'c': 3, 'name': 'jack'}
最后,python参数的定义形式虽然种类不是很多,但是使用时,尤其混合使用时一定要注意顺序。
如对本文有疑问, 点击进行留言回复!!
给Django Admin添加验证码和多次登录尝试限制的实现
网友评论