2 函数
help(函数名) #查看函数的帮助
2.1 数据类型转换函数
int(待转换的对象)
float(待转换的对象) str(待转换的对象) bool(待转换的对象)
2.2 函数定义
函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”。
定义:在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒
号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
pass语句相当于占位符,什么也不做,避免程序报错 isinstance(x, (int, float)) #参数类型检查 函数可以同时返回多个值,但其实是一个tuple
2.3 函数参数
位置参数:调用函数时,传入的值按照位置顺序依次赋予的参数;
默认参数:默认参数可以简化函数的调用;当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
有多个默认参数时,调用的时候,既可以按顺序提供默认参数,比如调用enroll('Bob',
'M', 7),意思是,除了name,gender这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值。
也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。比如调用enroll('Adam', 'M', city='Tianjin'),意思是,city参数用传进去的值,其他默认参数继续使用默认值。
注意: 定义默认参数要牢记一点:默认参数必须指向不变对象!
可变参数:定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数。
*nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。 关键字参数:
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
也可组装一个dict传给函数,注意kw获得的dict只是外部dict的一份拷贝,对kw的改动不会影响到函数外的dict 命名关键字参数:
def person(name, age, *, city, job): print(name, age, city, job)
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命
名关键字参数。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数;
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了;
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。
注意:参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参
数。
例:计算两个或多个数的乘积,可接收一个或多个参数 def product(*y): if len(y)==0:
raise TypeError res=1 for yy in y:
res=res*yy return res
2.4 尾递归
解决递归层数较多导致的栈溢出问题。例如:
3 高级特性
在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。
3.1 切片
对经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作。
L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。L[:3]可以省略0. L[-1]取倒数第一个元素,同样支持倒数切片
L[-10]取后10个元素
Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单。
例如:
>>> (0, 1, 2, 3, 4, 5)[:3] (0, 1, 2)
>>> 'ABCDEFG'[:3] 'ABC'
>>> 'ABCDEFG'[::2] #最后一个冒号后面的2表示间隔 'ACEG'
3.2 迭代
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items(); 注意:
如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断: >>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代 True
>>> isinstance([1,2,3], Iterable) # list是否可迭代 True
>>> isinstance(123, Iterable) # 整数是否可迭代 False
最后一个小问题,如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:
>>> for i, value in enumerate(['A', 'B', 'C']): ... print(i, value) ... 0 A 1 B 2 C
3.3 列表生成式
如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环: >>> L = []
>>> for x in range(1, 11): ... L.append(x * x) ... >>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list: >>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:
Python个人自学笔记 - 图文



