python-学习2
函数可以理解为最基本的代码抽象方式。不关心底层具体过程,只关心上层意义。
调用函数:
abs()、max()、hex()十六进制
类型转换
int()、float()、str()、bool()
函数名是一个指向函数对象的引用,可以通过将函数名赋值给变量,相当于给函数起一个别名(amazing)
a = abs
a(-1)
自定义函数:
def 定义
def my_abs(num):
if num>0:
return num
else:
return -num
isinstance()函数进行类型检查
def my_abs(num):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if num>0:
return num
else:
return -num
可以返回多个参数
返回一个tuple
默认参数
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
默认n为2,power(5)相当于power(5,2)
变化大的参数放前面,必写参数一定要放到默认参数后面
定义默认参数要牢记一点:默认参数必须指向不变对象!
* 可变参数 **关键字参数 *,命名关键字参数
递归函数
阶乘
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
fact(10000)时会导致栈溢出:
函数调用是通过栈(stack)这种数据结构实现,每当进入一个函数调用,栈就增加一层栈帧,函数返回时减少一层栈帧。栈大小有限,递归次数过多就会栈溢出。
用尾递归优化,可以将循环看成尾递归函数。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。编译器或解释器就会对其进行优化,只占一层栈帧。
def fact(n):
return fact_iter(n, 1)
def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)
遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。
练习汉诺塔的移动:
def move(n,a,b,c):
if n==1:
return print('a=>c')
切片:
L[:3] 取第0到2位 L[-1:] 取倒数第一位
L[0:10:2]前十个每两个取一个 L[::5]每五个取一个 L[:] 原list
tuple和字符串也可以用切片
迭代(for in):
只要是可迭代对象 都可以使用
通过collections模块的iterator判断
from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代
dict 迭代
d = {'a':1,'b':2,'c':3}
KEY :for key in d
VALUE :for value in d.values()
KET+VALUE : for k, v in d.items()
列表生成式
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
L1 = ['Hello', 'World', 18, 'Apple', None]
[l.lower() for l in L1 if isinstance(l,str)]
print(l)
生成器(generator):
一边循环一边计算
通过next()函数计算下一个
包含yield关键字的是generator,
generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
迭代器:Iterator
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
isinstance()函数判断对象是否是迭代器
生成器都是iterator,但是Iterable不一定是是iterator。用iter()函数将Iterable变成iterator
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;(无限大数据流)
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Python的for循环本质上就是通过不断调用next()函数实现的