• 函数之鱼渔事件


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

    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模块编程,用户输入一个生日,计算这个人来到这个世界已经多少天?
     
     
     
  • 相关阅读:
    使用命令行创建制作 MACOS HIGH SIERRA 正式版 USB 安装盘
    IONIC2/3解决文本框获取焦点的问题
    一步一步实现IONIC2/3 热更新
    IONIC打包安卓遇到COM.ANDROID.SUPPORT:SUPPORT-V4错误的解决办法
    js hoisting
    js立即执行函数
    关于js sort排序方法
    js基础--substr()和substring()的区别
    关于align-items和align-content的区别和使用场景
    关于ionic开发中遇到的坑与总结
  • 原文地址:https://www.cnblogs.com/liangsha0/p/10609534.html
Copyright © 2020-2023  润新知