1.关键字参数
①可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装成一个tuple
;而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict
。
![](https://img.haomeiwen.com/i7224081/07f5651d9f8056af.png)
2.命名关键字参数
①有什么用?
- 限制关键字参数的名字。
![](https://img.haomeiwen.com/i7224081/7fbc447cc6e59306.png)
- 注:调用时缺少参数名
city
和job
,Python
解释器把这4个参数均视为位置参数,但person()
函数仅能接收2个位置参数。
![](https://img.haomeiwen.com/i7224081/624b99d8a3ec64de.png)
![](https://img.haomeiwen.com/i7224081/92726d4ab107576e.png)
②命名关键字参数可以有缺省值(默认值),从而简化调用:
![](https://img.haomeiwen.com/i7224081/e866ffa66a5532bb.png)
③如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不需要一个特殊分隔符*
(asterisk)
![](https://img.haomeiwen.com/i7224081/c6007bc445f48cd9.png)
3.参数组合
①有哪几种参数?
- 必选参数、默认参数、可变参数、关键字参数和命名关键字参数
②参数定义的顺序?
- 必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
![](https://img.haomeiwen.com/i7224081/97cb8a6a82ddf8d8.png)
③神奇的tuple
和dict
![](https://img.haomeiwen.com/i7224081/9a8e7efd10773f42.png)
4.小结
①默认参数一定要用不可变对象!
②注意可变参数和关键字参数的语句:
*args是可变参数,args接收的是一个tuple;
**kw是关键字canshu,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})
5.递归函数
①是什么?
- 一个函数在内部调用自身。
②如何解决栈溢出?
- 尾递归优化。
③什么是尾递归优化?
![](https://img.haomeiwen.com/i7224081/011d149490fff92b.png)
6.Hanoi
![](https://img.haomeiwen.com/i7224081/82f4469611d43306.png)
7.切片
① 存在的原因?
- 因为我们经常需要获取一个
list
或tuple
的部分元素。
②[]
和 for ... in + range
和 slice
![](https://img.haomeiwen.com/i7224081/28feec9564ab6c36.png)
③支持倒数切片
![](https://img.haomeiwen.com/i7224081/ea9b147d1b73fcf8.png)
④slice各种操作
![](https://img.haomeiwen.com/i7224081/acd97e72c0c54d5e.png)
⑤tuple
也是一种list
,唯一区别是tuple
不可变。因此tuple
也可以进行切片操作,操作的结果仍是tuple
。
![](https://img.haomeiwen.com/i7224081/a1e465c87c887578.png)
⑥字符串也可以看成是一种list
,每个元素就是一个字符。因此,字符串也可以使用切片操作,操作结果仍是字符串。
![](https://img.haomeiwen.com/i7224081/4d7c6cd943f4f482.png)
8.迭代
①是什么?
- 当使用
for
循环来遍历整个list
或tuple
或str
时,这种遍历我们叫做迭代。
![](https://img.haomeiwen.com/i7224081/e91ede85fbc8bf44.png)
②只要是可迭代对象,无论有无下标,都可以迭代,比如dict
、set
。
![](https://img.haomeiwen.com/i7224081/b80c5e4d2937952d.png)
- 注意喔,这里还体现了代码块的执行顺序,hanoi
![](https://img.haomeiwen.com/i7224081/c1c5ec09e85aa3c1.png)
- 两种获得
dict
中value
的方式
![](https://img.haomeiwen.com/i7224081/ac22c425c4732e4f.png)
③如果我要同时迭代key
和value
怎么办?
![](https://img.haomeiwen.com/i7224081/6bc87ee0180d4f8b.png)
- 注意
print()
中的,
逗号,就相当于一个空格
④由于字符串也是可迭代对象,因此,也可作用域for
循环
![](https://img.haomeiwen.com/i7224081/5703d1343dc5b3ff.png)
⑤如何判断一个对象是可迭代对象?
- 通过
collections
模块的Iterable
类型判断:
![](https://img.haomeiwen.com/i7224081/e0069ee5532ab5ca.png)
⑥Python
内置的enumerate()
函数可以把一个list
变成索引-元素对。
![](https://img.haomeiwen.com/i7224081/b10eecb6075b779d.png)
9.列表生成式(list comprehensions)
:
①是什么?
-
Python
内置的创建list
的生成式。
②如果你要生成一个list
:[1,2,3,4,5]
![](https://img.haomeiwen.com/i7224081/354d3fb6169bb17f.png)
③如何生成[1,4,9,16,25]
?
![](https://img.haomeiwen.com/i7224081/5907e2cf0b6b7daa.png)
④简洁的方法:
![](https://img.haomeiwen.com/i7224081/b1b8675be4898ee2.png)
⑤还可以对输出的数据进行筛选,比如获取偶数
![](https://img.haomeiwen.com/i7224081/961e01d886ea76ea.png)
- 注意:奇数的平方还是奇数
⑥还是使用两层循环,生成全排列
![](https://img.haomeiwen.com/i7224081/b59adc37ede03b8f.png)
⑦for
循环可以同时使用两个甚至更多变量。
![](https://img.haomeiwen.com/i7224081/daa2b2413dcb2014.png)
⑧使用列表生成式简化
![](https://img.haomeiwen.com/i7224081/5c9886e82d448859.png)
⑨把一个list
中所有字符变成大/小写
![](https://img.haomeiwen.com/i7224081/ad1b1afd809d9eab.png)
⑩如果一个list
中既有字符串,也包含整数,如何将其中的字符串全部转换成小写格式。
- 解法1:
![](https://img.haomeiwen.com/i7224081/a61a7e3a51889d57.png)
- 解法2:
![](https://img.haomeiwen.com/i7224081/647fd3385d57edd2.png)
10.生成器(Generator)
①存在的原因?
- 假如我们需要一个包含100万个元素的列表,这会占据很大的内存空间,如果我们仅仅需要访问前面的几个元素,那么后面绝大多数元素占用的空间都白白浪费了。
②如何创建一个生成器?
![](https://img.haomeiwen.com/i7224081/2a5fc2be9a9c39b0.png)
- 创建
l
和g
的区别仅在于最外层的[]
和()
。l
是一个list
,而g
是一个generator
③如何打印generator
中的数据。
![](https://img.haomeiwen.com/i7224081/a2b47f515dec8fe6.png)
④如果没有更多的元素时,抛出StopIteration
的错误。
![](https://img.haomeiwen.com/i7224081/089c5da384c6896f.png)
⑤注意generator
也是可迭代对象喔:
![](https://img.haomeiwen.com/i7224081/c3bf0cfbdcc4ab72.png)
⑥既然是可迭代对象,也就可以用for
循环
![](https://img.haomeiwen.com/i7224081/66120e9c75b22b52.png)
11.fib
![](https://img.haomeiwen.com/i7224081/4b061b5345d4282f.png)
①用for
循环遍历generator
函数存在一个问题:
- 获取不到
return
语句的返回值。
![](https://img.haomeiwen.com/i7224081/da398350c1c01af7.png)
12.生成器之杨辉三角形 range(len(L)) + 列表生成式
的强大力量
![](https://img.haomeiwen.com/i7224081/9446e66ded957a4b.png)
网友评论