列表生成式 [x*x for x in range(1,11)]
生成器()小括号 表示生成器g []表示list g保存的是算法 用next()函数可以查看下一个生成器的值 用for循环迭代出结果 如果函数中有yield 表示该函数为生成器 yield()有打印print的功能
遇到yield
就中断,下次又继续执行generator函数的“调用”实际返回一个generator对象
可以直接作用于for
循环的数据类型有以下几种:
一类是集合数据类型,如list
、tuple
、dict
、set
、str
等;
一类是generator
,包括生成器和带yield
的generator function。
这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
可以使用isinstance()
判断一个对象是否是Iterable
对象
next()
函数调用并不断返回下一个值的对象称为迭代器:
Iterator
生成器都是Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。
把list
、dict
、str
等Iterable
变成Iterator
可以使用iter()
函数
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
Python的for
循环本质上就是通过不断调用next()
函数实现的
abs()
函数和调用变量
f()
完全相同
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
map每一个对应元素 全部用指定函数计算
reduce函数 将前两个值进行函数f运算,运算的结果再和第三个参数运算,以此类推下去
filter 过滤参数 依次作用于参数 判断结果是否为true 然后保留
Python内置的
sorted()
函数就可以对list进行排序sorted()
函数也是一个高阶函数,它还可以接收一个key
函数来实现自定义的排序
sorted()
也是一个高阶函数。用sorted()
排序的关键在于实现一个映射函数
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回
闭包 返回函数不懂
装饰器 调用now()
函数,不仅会运行now()
函数本身,还会在运行now()
函数前打印一行日志: 输出一行日志
>>> now()
call now():
2015-3-25
要让函数是可导入的,得先创建模块。模块 是扩展名为.py的文件,包含要导入到程序中的代码。下面来创建一个包含函数make_pizza() 的模块。为此,我们将文件pizza.py中
除函数make_pizza() 之外的其他代码都删除
import 模块 调用模块内函数 (模块名.py文件) 模块名.函数名
导入特定函数 from 模块 import 函数
别名 as 模块与函数均可别名
使用*号导入所有模块中的函数时 如果有重名 最好只导入想使用的函数 避免出错
给形参指定默认值时,等号两边不要有空格:
def function_name(parameter_0, parameter_1='default value')
建议代码行的长度不要超过79字符,这样只要编辑器窗口适中,就能看到整行代码。如果形参很多,导致函数定义的长度超过了
79字符,可在函数定义中输入左括号后按回车键,并在下一行按两次Tab键,从而将形参列表和只缩进一层的函数体区分开来。
编写类。类将函数和数据整洁地封装起来,能够灵活而高效地使用它们
在Python中,首字母大写的名称指的是类
方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突
将方法__init__() 定义成了包含三个形参:self 、name 和age 。在这个方法的定义中,形参self 必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参self 呢?因为Python调用这个__init__() 方法来创建Dog 实例时,将自动传入实参self 。每个与类相关联的方法调用都自动传递实参self ,它是一个指向实例本身
的引用,让实例能够访问类中的属性和方法。我们创建Dog 实例时,Python将调用Dog 类的方法__init__() 。我们将通过实参向Dog() 传递名字和年龄;self 会自动传递,因此我们不需要传递它。每当我们根据Dog 类创建实例时,都只需给最后两个形参(name 和age )提供值
在Python 2.7中创建类时,需要做细微的修改——在括号内包含单词object
可以以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)
继承 继承时使用super()继承并初始化父类
首先是Car 类的代码(见❶)。创建子类时,父类必须包含在当前文件中,且位于子类前面。在❷处,我们定义了子类ElectricCar 。定义子类时,必须在括号内指定父类的名称。方法__init__() 接受创建Car 实例所需的信息(见❸
❹处的super() 是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用ElectricCar 的父类的方法__init__() ,让ElectricCar 实例包含父类的所有属性。父类也称为超类 (superclass),名称super因此而得名
重写父类的方法
打开文件 with open
关键字with的用法
以写入('w' )模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。
Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str() 将其转换为字符串格式
函数write() 不会在你写入的文本末尾添加换行符
模块json 来存储数据 json.dump()存储数据 json.load()
重构
你经常会遇到这样的情况:代码能够正确地运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程被称为重构 。重构让代码更清晰、更易于理解、更容易扩展
使用Python模块unittest 中的工具来测试代码
unittest Module中的断言方法