函数:可以重复执行的语句块,可以重复调用。
def函数名(参数列表):
语句块(代码块)
key1:传参和形参相互照应,但不是一个东西。
传参方式:形参定义方式:
位置传参1.位置形参arg
序列传参* 2.星号元组形参* args
关键字传参3.命名关键字形参参名= arg
字典关键字传参** 4.双星号字典形参** args
位置传参----位置形参:散进散坐,按顺序对应就坐,位置数量固定,多了少了都不行。
-----星号元组形参:散进团坐,顺序入座,都有座位。如果单座每了,坐元组里。
序列传参----位置形参:团进散坐,*拆解后,按顺序就坐,位置数量固定。
----星号元组形参:团进团坐,*拆解后,顺序就坐在元组里。都有座位
需要注意2点:1。传参是序列,需要用*拆解序列,一个一个进入函数的实参元组中,否则会整体代表一个参数传入。
2.星号元组形参可以吸收多余的位置形参,这些被多余的形参会被装在一个元组里!在这个元组里!
In [42]: def fx(*args):
....: print(args)
....: print(*args)
....:
In [43]: fx(1,2,3,4)
(1, 2, 3, 4)
1 2 3 4
In [44]: fx([1,2,3,4])
([1, 2, 3, 4],)
[1, 2, 3, 4]
In [45]: fx(*[1,2,3,4])
(1, 2, 3, 4)
1 2 3 4
关键字传参----命名关键字形参:散进散坐,按名字入座呗,一个萝卜一个坑,多了少了都不行
-----双星号字典形参:散进团坐,按名字坐,单座没了坐在字典里。
字典关键字传参----命名关键字形参:团进散坐,**拆解,各自按照自己名字的座位坐,座位数量固定。多少都不行。
-----双星号字典形参:团进团坐,**拆解,按名字坐,单座没了坐在字典里。
In [3]: def fn(**kwargs):
print(kwargs)
In [4]: fn(a=1,b=2,c=3)
{'b': 2, 'a': 1, 'c': 3}
In [5]: fn(**{'a':1, 'b':2, 'c':3})
{'a': 1, 'b': 2, 'c': 3}
key2:传参方式,形参方式都可以结合使用,但要注意设置顺序
传参:通常位置传参和序列传参先传递,其次是关键字传参和字典关键字传参
形参:fn(位置形参,星号元组形参,命名关键字形参,双星号字典形参)
可以接收任意位置传参和关键字传参的函数:
def fn(* args,** kwargs):
psss
PS。一个小练习
写一个函数,实现range功能。
def myrange(*args):
start = 0
end = 0
step = 1
# L = [] 还没有学到生成器 yield函数的可以将生成数字放入列表再取出
# 先对传入参数进行判断和赋值
if len(args) == 1:
end = args[0]
elif len(args) == 2:
start = args[0]
end = args[1]
elif len(args) == 3:
start = args[0]
end = args[1]
step = args[2]
else:
print("输入不合法")
return None
# 根据参数生成整数
if step > 0 and end > start:
while start < end:
# L.append(start)
yield start
start += step
# return L
elif step < 0 and end < start:
while start > end:
# L.append(start)
yield start
start += step
# return L
else:
return None
# 测试用例
print(list(myrange(10)))
print(list(myrange(10,0)))
print(list(myrange(1,5,2)))
print(list(myrange(10,5,-2)))
print(list(range(10)))
print(list(range(10,0)))
print(list(range(1,5,2)))
print(list(range(10,5,-2)))