授人以鱼,不如授人以渔.
1.如何查看一个类,一个包中所有可用的函数信息
2.如何查看一个具体的函数的使用方式.
3.chm离线帮助文档的使用.
函数的定义和使用:
def 函数名(形参列表):
函数体
[return [返回值]]
def是关键字.
函数名是符合命名规范的名字即可.
形参列表是符合命名规范的多个变量,变量中间用逗号分隔.
函数的形参列表:
1.位置参数,按照出现的顺序给形参赋值
2.默认值参数,可以不用赋值.
3.可变的位置参数,多个出现的位置参数,使用一个元组名接收.
4.可变的关键字参数,多个出现的键值对参数,使用的是一个字典接收.
可变的关键字参数一定放在最后,可变的位置参数一定在位置参数之后.
例如:
def f1(name,addr='BeiJing',*args,**kwargs):pass
def f2(name,*args,addr='BeiJing',**kwrags):pass
推荐使用第二种,因为第一种的默认值参数几乎起不到作用.
后面的args要想被赋值,addr就必须指定值.那样默认值就没有意义了.
可迭代对象和迭代器对象的区别:
后者有iter和next两个方法,而前者只有一个iter方法.
迭代器对象一定是可迭代的,但是可迭代的不一定是迭代器.(具体区别画图)
from collections import Iterable,Iterator
isinstance(x,Iterable) 判断是否是可迭代的.
isinstance(x,Iterator) 判断是否是迭代器
生成器函数:
包含yield关键字的函数定义,就是生成器函数,生成器函数也是一个迭代器!
生成器函数的使用:
通常情况下,是使用for循环的方式使用生成器.实际底层使用的是迭代器的next方法.所以,也可以使用next()方法直接触发生成器产生一个值.
针对是否有赋值语句,以及是否使用传值的方式触发生成器,一共有四种形式:
1.没有赋值语句,使用next方法触发
2.没有赋值语句,使用send方法触发.此时实际上传递的值都被丢弃掉了.
3.有赋值语句,使用next方法触发,此时实际上传递的都是None值.
4.有赋值语句,使用send方法触发,此时值才被真正的传递给了yield表达式中.
注意有赋值语句的表达式的执行顺序问题:
第一次使用send赋值,只能是None值,或者使用next方法触发,实际上也是传递了None值.
从第二次开始,可以传递有意义的值.
执行的顺序是:先给赋值语句左侧的变量赋值,然后执行yield语句下面的语句,最后返回的是yield关键字后面的值.
装饰器函数:
装饰器函数一定是一个闭包函数,在函数内部定义一个函数,并返回.
def wrapper(fn):
def inner(*args,**kwargs):
print('hello') # 前置增强写在这里
ret = fn(*args,**kwargs) # 原始函数调用在这里
return ret
return inner
装饰器函数的两种使用方式:
1.在被装饰的函数上使用@装饰器名
2.使用普通的函数名绑定的方式
func = wrapper(func)
不论哪种方式,目的都是一个,让装饰器函数返回的函数绑定回原始的函数名.
注意:装饰器函数中的可执行语句会被马上执行!!!
带有参数的函数装饰器(三层函数的嵌套)
内置函数:
主要是高阶函数.
map,filter,
sorted()
注意:sorted一定是返回了一个新的排好序的对象.所以,通常都会使用变量接收.
序列化模块,随机数模块,
json:将数据格式化成字符串的过程是序列化,反过来是反序列化.
常用方法:
dumps:将数据序列化成字符串,保存到内存中.
dump:将数据序列化成字符串,保存在文件中.
loads:将内存中的序列化字符串,反序列化成数据
load:将文件中的序列化字符串,反序列化成数据
json只能序列化python中常见的数据类型,集合这种数据类型就不能识别.
它的特点是比较通用.简单.
json字符串保存在文件中,反序列化时只能一次性都反序列化到内存中,没有办法将多次序列化的内容分开反序列化.
如何实现将多次序列化的内容依次反序列化?
可以先把多次需要序列化成json的数据先序列化到内存中,然后在数据后添加换行符.再把这样的数据写到文件中.
反序列化时,只需要依次读取文件中的内容,并按照行为单位,再依次进行反序列化,就可以的到每次序列化的结果.
pickle模块:
pickle模块是一种专门针对python设计的序列化方案,它可以对python中所有的数据类型进行序列化,而不会产生数据丢失.
pickle序列化产生的结果是字节序列.
所以,在往文件中序列化数据时,要求文件的使用方式一定是二进制格式.
使用方式上和json基本一致.
dumps:将数据序列化成字符串,保存到内存中.
dump:将数据序列化成字符串,保存在文件中.
loads:将内存中的序列化字符串,反序列化成数据
load:将文件中的序列化字符串,反序列化成数据
shelve模块:
主要用来将数据进行本地存储,而不是通过网络传输.
序列化过程中一定要使用到本地文件,并且会产生多个文件用于文件的存储.
数据一旦序列化,就可以像使用字典一样方便查找和使用.
常用的方法就是打开文件的方法:open,这也说明了这个模块主要作用就是对数据进行持久化使用的,而非是网络传输.
import shelve
db = shelve.open('a.txt')
db['name'] = 'abc'
db['info'] = {'email':'abc@abc.com','addr':'BeiJing'}
序列化:最终目的:
实现了数据和程序的分离!!!!
随机数模块:random
1.获取一个[0,1)之间的浮点数
2.获取一个区间之内的整型值.randint(start,end)
3.从一个序列中获取一个随机的元素:random.choice
4.洗牌:shuffle
os操作系统模块:
参考笔记
sys模块:
参考笔记
推导式:
推导式也叫内涵:是快速创建具有某种规律的数据的方式.
列表推导式 == 列表内涵
字典推导式 == 字典内涵
集合推导式 == 集合内涵
列表推导式:
[变量表达式 for 变量 in 范围 if条件判断]
lst = [1,2,3,4,5]
[x for x in lst if x % 2 == 0]
集合推导式:
{变量表达式 for 变量 in范围 if条件判断}
没有元组推导式,表现形式上使用()括起来的推导式,实际上是一个生成器对象.
hashlib模块:
主要是md5加密函数.
md5加密的主要步骤是:
1.创建一个md5加密对象,此时可以指定盐,也必须是字节序列类型.
2.针对字节序列类型的数据进行加密.
3.使用hexdigest或者是digest获取加密后的结果字节序列.
前者返回值是字符串,后者返回值是字节序列
md5加密主要使用场景:
用于对已经存在的密文和另一个用同样算法得到的密文进行比对.以此判断两个明文是否一致.
而并不是从一个密文中将明文还原.
time模块
和时间相关的模块.
主要掌握如何获取一个格式时间字符串,strftime.
此模块中主要有三种数据类型:
1.struct_time
2.格式化时间字符串
3.时间戳
gmtime,localtime这两个函数如果不加任何参数的话,结果就是一个结构化时间对象.它是一个包含了9个字段的一个对象.
这9个字段的值都是可以单独取出的.
通过这个结构化时间对象,可以转化成一个可读性强的时间字符串.
time.strftime('%Y-%m-%d')
'2019-03-20'
结构化时间对象strftime->时间字符串
时间字符串strptime->结构化时间对象
结构化时间对象 mktime->时间戳
时间戳gmtime,localtime->结构化时间对象
判断题:
1.生成器本质上是一种迭代器.
2.生成器的主要作用是为了节省内存消耗.
3.Python中实现生成器的主要方式是通过yield关键字.
4.装饰器函数是一个闭包函数.(绝大多数场景下,必须使用闭包.)
1.写一个生成器函数,用于获取100以内所有7的倍数.
2.写一个装饰器函数,用于对一个函数进行运行时间的计算.
3.使用time模块编程,用户输入一个生日,计算这个人来到这个世界已经多少天?