1.关键字参数
①可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装成一个tuple
;而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict
。
2.命名关键字参数
①有什么用?
- 限制关键字参数的名字。
- 注:调用时缺少参数名
city
和job
,Python
解释器把这4个参数均视为位置参数,但person()
函数仅能接收2个位置参数。
②命名关键字参数可以有缺省值(默认值),从而简化调用:
命名关键字参数可以设置默认值从而简化调用.png③如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不需要一个特殊分隔符*
(asterisk)
3.参数组合
①有哪几种参数?
- 必选参数、默认参数、可变参数、关键字参数和命名关键字参数
②参数定义的顺序?
- 必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
③神奇的tuple
和dict
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.递归函数
①是什么?
- 一个函数在内部调用自身。
②如何解决栈溢出?
- 尾递归优化。
③什么是尾递归优化?
尾递归.png6.Hanoi
hanoi.png7.切片
① 存在的原因?
- 因为我们经常需要获取一个
list
或tuple
的部分元素。
②[]
和 for ... in + range
和 slice
③支持倒数切片
slice中可为负值.png④slice各种操作
slice一波操作.png⑤tuple
也是一种list
,唯一区别是tuple
不可变。因此tuple
也可以进行切片操作,操作的结果仍是tuple
。
⑥字符串也可以看成是一种list
,每个元素就是一个字符。因此,字符串也可以使用切片操作,操作结果仍是字符串。
8.迭代
①是什么?
- 当使用
for
循环来遍历整个list
或tuple
或str
时,这种遍历我们叫做迭代。
②只要是可迭代对象,无论有无下标,都可以迭代,比如dict
、set
。
- 注意喔,这里还体现了代码块的执行顺序,hanoi
- 两种获得
dict
中value
的方式
③如果我要同时迭代key
和value
怎么办?
- 注意
print()
中的,
逗号,就相当于一个空格
④由于字符串也是可迭代对象,因此,也可作用域for
循环
⑤如何判断一个对象是可迭代对象?
- 通过
collections
模块的Iterable
类型判断:
⑥Python
内置的enumerate()
函数可以把一个list
变成索引-元素对。
9.列表生成式(list comprehensions)
:
①是什么?
-
Python
内置的创建list
的生成式。
②如果你要生成一个list
:[1,2,3,4,5]
③如何生成[1,4,9,16,25]
?
④简洁的方法:
使用列表生成式.png⑤还可以对输出的数据进行筛选,比如获取偶数
筛选出偶数.png- 注意:奇数的平方还是奇数
⑥还是使用两层循环,生成全排列
两个for循环的组合成全排列.png⑦for
循环可以同时使用两个甚至更多变量。
⑧使用列表生成式简化
列表生成式使用两个变量.png⑨把一个list
中所有字符变成大/小写
⑩如果一个list
中既有字符串,也包含整数,如何将其中的字符串全部转换成小写格式。
- 解法1:
- 解法2:
10.生成器(Generator)
①存在的原因?
- 假如我们需要一个包含100万个元素的列表,这会占据很大的内存空间,如果我们仅仅需要访问前面的几个元素,那么后面绝大多数元素占用的空间都白白浪费了。
②如何创建一个生成器?
list和generator的区别.png- 创建
l
和g
的区别仅在于最外层的[]
和()
。l
是一个list
,而g
是一个generator
③如何打印generator
中的数据。
④如果没有更多的元素时,抛出StopIteration
的错误。
⑤注意generator
也是可迭代对象喔:
⑥既然是可迭代对象,也就可以用for
循环
11.fib
fib.png
①用for
循环遍历generator
函数存在一个问题:
- 获取不到
return
语句的返回值。
网友评论