41.可变参数
计算a2+b2+c2+...
def calc(*nums):
sum = 0
for i in nums:
sum = sum + i * i
return sum
print(calc(2, 4, 6))
print(calc(2, 4, 6, 8, 10))
输出:
56
220
在传的参数前面加一个*就代表可变参数,在调用时可以传入任意多个参数,传入的多个参数是作为一个元组进行传入的。
如果已经有一个元组或者列表,如何传入可变参数的方法中?
def calc(*nums):
sum = 0
for i in nums:
sum = sum + i * i
return sum
a = [0, 1, 2, 4]
print(calc(*a))
输出:21
只需要在元组或者列表的前面加一个*,就可以把这个元组或者列表的所有元素作为一个可变参数传入方法
42.关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
用法是在参数前面加上**
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
person("Allen", 32)
person("Bob", 22, hobby="game")
person("Charles", 56, hobby="music", Status="married")
输出:
name: Allen age: 32 other: {}
name: Bob age: 22 other: {'hobby': 'game'}
name: Charles age: 56 other: {'hobby': 'music', 'Status': 'married'}
同时也可以把一个字典通过在字典前加上**传入关键字参数
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
d = {"hobby": "reading", "Status": "single", "city":"Nanjing"}
person("Davis", 12, **d)输出:
name: Davis age: 12 other: {'hobby': 'reading', 'Status': 'single', 'city': 'Nanjing'}
43.命名关键字参数
命名关键字参数可以对传入的参数进行一定的限制
def person(name, age, *, city, job):
print(name, age, city, job)
在进行调用时,命名关键字参数需要使用参数名对应值的方式进行调用
person('Jack', 24, city='Beijing', job='Engineer')
输出:Jack 24 Beijing Engineer
44.组合参数
用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差。
45.递归函数
在一个函数的内部调用自身函数
例如计算阶乘
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print(factorial(10))
输出:
3628800
递归函数可以用循环实现,使用递归函数能够使得逻辑更加清晰
递归函数容易出现栈溢出的问题,解决方法是采用尾递归优化(以后用到再学习)
46.切片操作
切片操作是,对一个列表或者元组进行一定范围或者规律的截取
生成一个0-19数字的列表
Demo = list(range(20))
语法是:List[起始点:终点:步长]
其中起始点,终点,步长都可以省略,省略起始点代表从下标0的地方开始,省略终点代表从起始点取到结束,省略步长代表步长为1,起始点和终点都可以为负数,-1为最后一个元素
取前五个元素
print(Demo[0:5])
取前三个元素,省略起始点
print(Demo[:3])
取后五个元素
print(Demo[15:20])
取后五个元素,省略终点
print(Demo[15:])
取后五个元素,用负数形式
print(Demo[-5:])
取前十个元素的偶数,步长为2
print(Demo[0:10:2])
取五的倍数,省略起始点和终点,步长为5
print(Demo[::5])
输出:
[0, 1, 2, 3, 4]
[0, 1, 2]
[15, 16, 17, 18, 19]
[15, 16, 17, 18, 19]
[15, 16, 17, 18, 19]
[0, 2, 4, 6, 8]
[0, 5, 10, 15]
47.迭代
遍历可迭代的对象中的每个元素,常用的是列表、元组和字符串(词典这类没有下标的也可以迭代,但是迭代出的结果,顺序可能不一样)
Demo = list(range(20))
for i in Demo:
print(i, end=" ")
输出:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
可以在for循环里引用两个变量,第一个变量可以代表索引编号,在enumerate中,start=1表示索引从1开始
Demo = list(range(5))
for i, element in enumerate(Demo, start=1):print(i, element)输出:
1 0
2 1
3 2
4 3
5 4
48.判断一个对象是否可以被迭代,可以通过collections模块的Iterable
from collections import Iterable
print(isinstance("Tony", Iterable))输出:
True
isinstance是用来判断变量类型的
用法是
isinstance(变量, 类型)
如果符合就返回True,如果不符合就返回False
49.enumerate方法
enumerate讲一个可以迭代的对象中的所有元素组合为一个索引序列,同时列出数据和数据下标,常用在for循环中
用法:
enumerate(可迭代对象,[start=0])
start=0代表生成索引序列的下标是从0开始,返回的是一个可枚举的对象
fruits = ["apple", "banana", "orange"]
for i, value in enumerate(fruits, start=1):print(i, value)输出:
1 apple
2 banana
3 orange
50.列表生成式
列表生成式,是可以通过一定条件,生成列表的方式,可以简化代码,(与循环语句生成一个效果,但是代码量少了不少)
利用循环语句生成1-10平方的列表
demo = []
for i in range(1, 11):
demo.append(i * i)
print(demo)
输出:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
列表生成式
print([i * i for i in range(1, 11)])
输出:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
如果再加上判断,就更加明显了,生成1-10中偶数的平方
demo = []
for i in range(1, 11):
if i % 2 == 0:
demo.append(i * i)
print(demo)
输出:
[4, 16, 36, 64, 100]
列表生成式:
print([i * i for i in range(1, 11) if i % 2 == 0])
输出:
[4, 16, 36, 64, 100]