授人以鱼,不如授人以渔.

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模块编程,用户输入一个生日,计算这个人来到这个世界已经多少天?
 
 
 
posted on 2019-03-27 18:15  LiangShaoY  阅读(149)  评论(0编辑  收藏  举报