一、基础复习
函数的基本用法 创建和调用函数 函数的形参与实参等等
二、函数的几种参数
1.位置参数
一般情况下实参是按照形参定义的顺序进行传递的,而Python中位置固定的参数我们称为位置参数。
>>> def myfunc(s,vt,o):
return "".join((o,vt,s)) #颠倒顺序组成字符串并返回
>>> myfunc("我","打了","小甲鱼")
'小甲鱼打了我'
>>> myfunc("小甲鱼","打了","我")
'我打了小甲鱼'
扩展:函数.join()用法: 将序列(也就是字符串、元组、列表、字典)中的元素以指定的字符连接生成一个新的字符串。
>>> a=["我","打了","小鲫鱼"] # 列表使用‘空格’作为分隔符
>>> print(" ".join(a))
我 打了 小鲫鱼
>>> print("".join(a)) # 结果
我打了小鲫鱼
>>>
a='I love China !' #字符串使用‘空格’作为分隔符
print(' '.join(a))
I l o v e C h i n a ! # 结果
a=('I','love','China','!') #元祖使用‘空格’作为分隔符
print(' '.join(a))
I love China ! # 结果
a={"I":1,'love':2,'China!':3} #字典使用‘空格’作为分隔符
print(' '.join(a))
I love China! # 字典有时结果不一样的原因:字典的读取是随机的结果
2.关键字参数
使用关键字参数只需要知道参数的名字即可。
>>> def myfunc(s,vt,o):
return "".join((o,vt,s))
>>> myfunc(o="我",vt="打了",s="小甲鱼")
'我打了小甲鱼'
如果同时使用位置参数和关键字参数,则它们的位置需要注意一下,位置参数必须在关键字参数之前,否则会出错。
>>> def myfunc(s,vt,o):
return "".join((o,vt,s))
>>> myfunc(o="我","清蒸","小甲鱼") #位置参数必须在关键字参数之前,
SyntaxError: positional argument follows keyword argument
>>>
>>> myfunc("我","清蒸",o="小甲鱼")
'小甲鱼清蒸我'
3.默认参数
Python允许函数参数在定义的时候就指定默认值的,这样的话,在函数调用的时候,如果没有传入实参,就会采用默认的参数来代替。如果使用默认参数,则将其放到最后。
>>> def myfunc(s,vt,o="小甲鱼"):
return "".join((o,vt,s))
>>> myfunc("香蕉","吃")
'小甲鱼吃香蕉'
>>> myfunc("香蕉","吃","小鲫鱼") #第三个参数如果赋值,就会覆盖默认值。
'小鲫鱼吃香蕉'
>>> def myfunc(s="苹果",vt,o="小甲鱼"): #如果使用默认参数,则将其放到最后。
return "".join((o,vt,s))
SyntaxError: non-default argument follows default argument
>>> def myfunc(vt,s="苹果",o="小甲鱼"): #正确写法,默认参数放最后。
return "".join((o,vt,s))
>>> myfunc("喜欢吃")
'小甲鱼喜欢吃苹果'
三、help()函数冷门用法
1.help()函数与abs()和sum()联用讲解关键字参数
通过观察abs(x, /)中反斜杠的位置来判断关键字参数。主要看第二点help()函数与sum()函数联用讲解关键字参数。
斜杠的意思为斜杠左侧的参数,它必须传递位置参数,而不能是关键字参数
>>> help(abs)
Help on built-in function abs in module builtins:
abs(x, /)
Return the absolute value of the argument.
abs()函数求绝对值
举例:
>>> abs(-1.5)
1.5
>>> abs(x=1.5) # abs(x, /)斜杠左侧必须为位置参数。
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
abs(x=1.5)
TypeError: abs() takes no keyword arguments
2.help()函数与sum()函数联用讲解关键字参数
- python版本号3.7.3使用help()查看sum()函数的用法,显示sum(iterable, start=0, /),其中反斜杠在最后面,
>>> help(sum)
Help on built-in function sum in module builtins:
sum(iterable, start=0, /)
Return the sum of a 'start' value (default: 0) plus an iterable of numbers
When the iterable is empty, return the start value.
This function is intended specifically for use with numeric values and may
reject non-numeric types.
- python3.9.9版本关于sum函数的用法显示sum(iterable, /,start=0)
斜杠的意思为斜杠左侧的参数,它必须传递位置参数,而不能是关键字参数
python版本不同,sum函数中反斜杠的位置不同。
这里举例使用 python版本3.9.9sum(iterable, /,start=0)这种用法来讲解:
>>> sum([1,2,3],4) #左侧只能使用位置参数,右侧位置参数和关键字参数都可以。
10
>>> sum([1,2,3],strat=4)
10
自定义函数也是遵从这一语法:左侧只能使用位置参数,右侧位置参数和关键字参数
def abc(a,/,b,c):
print(a,b,c)
>>> abc(1,2,3)
1 2 3
>>> abc(a=1,2,3) #斜杠左侧只能使用位置参数
SyntaxError: positional argument follows keyword argument
>>> abc(3,b=2,c=1)
3 2 1
只能使用关键字参数的语法: 用星号*
星号的左侧既可以是位置参数,也可以是关键字参数,右侧只能是关键字参数。
>>> def abc(a,*,b,c):
print(a,b,c)
>>> abc(1,2,3) # 右侧只能是关键字参数
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
abc(1,2,3)
TypeError: abc() takes 1 positional argument but 3 were given
>>> abc(1,b=2,c=3)
1 2 3
>>> abc(a=1,b=2,c=3)
1 2 3
>>>
课后题:
1.如果一个函数要求传递位置参数,那么颠倒实参的顺序,肯定会报错,是吗?
答:也不一定。
解析:比如 min() 或者 max() 函数,参数顺序没有要求。
2.默认参数跟关键字参数有啥区别?
答:位置不同,默认参数是存在于函数定义中的,而关键字参数是在函数调用中发挥作用。
解析:在函数定义的时候,使用等号(=)来表示默认参数,默认参数的优点是如果没有传入实参,那么将采用默认的参数值代替;在函数调用的时候,使用等号(=)来表示关键字参数,关键字参数的优点是不需要顾虑参数的传递顺序(除非在定义中有 “特殊” 的声明)。
3.任何支持传递位置参数的函数,都可以使用关键字参数吗?
答:也不全是。
解析:见下题解析。
4.请问下面代码是否会报错,为什么?
>>> def abc(a, /, b, c):
... print(a, b, c)
...
>>> abc(a=3, b=2, c=1)
# 请问这里会报错吗?
答:会报错!
解析:在函数的定义中出现斜杠(比如 abs(x, /)),表示在其左侧的参数必须传递位置参数,而不能是关键字参数(右侧则无所谓)。
>>> abs(x = -250)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
abs(x = -250)
TypeError: abs() takes no keyword arguments
咱们自己定义函数,也是遵从这么一个语法:
>>> def abc(a, /, b, c):
... print(a, b, c)
...
>>> abc(1, 2, 3)
1 2 3
>>> abc(a=3, b=2, c=1)
Traceback (most recent call last):
File "<pyshell#82>", line 1, in <module>
abc(a=3, b=2, c=3)
TypeError: abc() got some positional-only arguments passed as keyword arguments: 'a'
>>> abc(3, b=2, c=1)
3 2 1
题目来自小甲鱼函数II