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()函数实现的

你可能感兴趣的:(python-学习2)