美文网首页
Python - Day7

Python - Day7

作者: 姚屹晨 | 来源:发表于2017-10-01 22:38 被阅读7次

廖雪峰

1.迭代器

①可迭代对象 Iterablelisttupledictsetstr(这五个是集合数据类型)、generator(生成器和带yieldgenerator function

②生成器不但可以作用于for循环,还可被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误。

③什么是迭代器(Iterator)

  • 可以被next()函数调用并不断返回下一个值的对象成为迭代器。
使用isinstance判断该对象是否为Iterator对象.png

④生成器都是Iterator对象,但listtupledictsetstr虽然是Iterable,却不是Iterator。但可以通过iter()函数转换为Iterator对象。

使用iter()函数将Iterable转换为Iterator对象.png

IterableIterator的区别

What is the difference between Python Iterator and Iterable?

a)iterator只能迭代一次,而iterable可迭代多次

Iterator只能迭代一次.png Iterable可迭代多次.png

b)PythonIterator对象表示的是一个数据流,Iterator对象可以被next()调用并不断返回下一个数据,直到没有数据时,抛出StopIteration异常。可以把这个数据流看做是一个有序列表,但我们提前并不知道这个序列的长度,只能不断通过next()函数计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

2.小结

①凡是可作用于for循环的对象都是Iterable类型。

②凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列。

③集合数据类型,如:listtupledictsetstr等都是Iterable对象,但不是Iterator对象,但是,可以通过iter()函数将其转换成Iterator对象。

Pythonfor循环本质上就是通过不断调用next()函数实现的:

for循环的本质其实就是不断调用next()函数.png
3.函数式编程

①什么是面向过程的程序设计?

  • 其实就是把一大段代码分解为若干个函数,通过一层一层的函数调用,将复杂的任务简单化。

②什么是函数式编程(Functional Programming)

  • 它是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入时确定的,输出就是确定的,这种纯函数称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能会得到不同的输出,因此,这种函数是有副作用的。

③函数式编程的特点?

  • 允许把函数本身作为参数传入另一个函数,还允许返回一个函数。

Python对函数式编程提供部分支持。因为Python允许使用变量,因此,Python不是纯函数式编程语言。

4.高阶函数(Higher-order function)

①变量可以指向函数

变量可以指向函数.png

②函数名其实就是指向函数的变量

  • 对于abs()这个函数,完全可以把函数名abs看成变量,它指向了一个可以计算绝对值的函数。
abs只是一个指向计算绝对值的函数的变量.png

③什么是高阶函数?

  • 既然变量可以指向函数,函数的参数可以接收变量,函数a可以作为参数传入函数b,函数b就叫高阶函数。
将abs函数作为参数传入add函数并返回两个经过绝对值计算的数据的和.png
5.小结

①将函数作为参数传入,这样的函数成为高阶函数,函数式编程指的就是这种高度抽象的编程范式。

6.map() / reduce()

map()接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

map()接收一个函数和一个Iterable对象.png

②把这个list所有数字都转化为字符串

把list中的所有数值都转换为字符串.png

③其实也可以用列表生成式做到

使用列表生成式.png

reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
reduce基本用法.png 内置函数sum()求和.png

⑤将[1,3,5,7,9]转换成整数13579

13579.png

⑥将str转换为int的函数

char_to_num.png

⑦利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。

  • 方法1:
方法1.png

方法2:capitalize() - 首字母大写

capitalize().png
7.filter()

①是什么?

  • filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
filter.png

8.sorted()
sorted()可以接收一个key函数来实现自定义的顺序。

key=abs.png
  • key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
key=abs过程.png

key的强大之处

key的强大之处.png

sorted()也是一个高阶函数(函数作为参数)。用sorted()排序的关键在于实现一个映射函数。

key不一定只是内置函数可以自定义函数.png 分数从低到高.png 分数从高到底reverse=True.png
9.返回函数

①实现一个可变参数的求和。

实现一个求和函数.png

②如果我现在不需要立即求和,而是根据后面的需要再求,怎么办?

  • 在一个函数a内部嵌套另一个函数b,并将函数b作为结果返回,以便需要时调用。
函数作为返回值是为了之后获取其内部函数的结果.png
10.匿名函数

①关键字lambda表示匿名函数,冒号前的x表示函数参数。

lambda匿名函数.png

②匿名函数的限制?

  • 只能有一个表达式

③匿名函数的好处?

  • 因为函数没有名字,所以不用担心函数名冲突。

④那能否调用匿名函数?

  • Sure。因为匿名函数也是一个函数对象,所以可用将匿名函数赋值给一个变量,再利用变量来调用该函数。
调用匿名函数.png

⑤当匿名函数作为函数返回值调用的两种方式:

当匿名函数作为函数返回值调用的两种方式.png
11.装饰器(decorator)

①函数也是一个对象,函数对象可以被赋值给变量,所以变量也能调用该函数,那么怎么知道最初的函数名?

如何获取最初的函数名.png

②装饰器是什么?

  • 在代码运行期间动态增加功能的方式,称之为"装饰器"
在代码运行期间动态增加功能.png

③三层嵌套的decorator

三层decorator.png now的__name__特性变成wrapper了.png
12.偏函数Partial function

int()函数还提供额外的base参数,默认值为10。通过传入的base参数,可以做N进制的转换。

int()的base参数.png
  • 注:把字符串先转化为整数,然后再以八进制格式输出。
先将字符串转换为整数然后转换为base进制输出.png

②当函数的参数个数过多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数(函数对象、*args和**kw),从而在调用时更简单。

相关文章

网友评论

      本文标题:Python - Day7

      本文链接:https://www.haomeiwen.com/subject/gqlaextx.html