zoukankan      html  css  js  c++  java
  • Python基础复习(第二天)

    函数

    什么是函数

    具备某一功能的工具就是函数

    为什么要有函数

    解决代码冗余的问题,重复性的代码可以封装成一个函数,用的时候调用即可

    如何用函数

      1.先定义,后调用
      2. def func(*args,**kwargs):
            print('这是函数的基本语法')
            return [{},'']
      3.函数的使用分为定义阶段与调用阶段,定义函数时只检测语法,不执行函数体代码,函数名加括号即函数调用,只有调用函数时才会执行函数体代码
      4.return是一个函数结束的标志,函数内可以有多个return,但只执行一次函数就结束了,并把return后定义的值作为本次调用的结果返回
    

    函数的参数

      1.在定义函数时,按照从左到右的顺序依次定义形参,称为位置形参,凡是按照这种形式定义的形参都必须被传值
      2.在调用函数时,实参可以是key=value的形式,称为关键字参数,凡是按照这种形式定义的实参,可以完全不按照从左到右的顺序定义,但仍能为指定的形参赋值
      3.需要注意在调用函数时,实参也可以是按位置或按关键字的混合使用,但必须保证关键字参数在位置参数后面,且不可以对一个形参重复赋值
      4.在定义函数时,就已经为形参赋值,这类形参称之为默认参数,当函数有多个参数时,需要将值经常改变的参数定义成位置参数,而将值改变较少的参数定义成默认参数。例如编写一个注册学生信息的函数,如果大多数学生的性别都为男,那完全可以将形参sex定义成默认参数
      5.想要限定函数的调用者必须以key=value的形式传值,Python3提供了专门的语法:需要在定义形参时,用作为一个分隔符号,号之后的形参称为命名关键字参数。对于这类参数,在函数调用时,必须按照key=value的形式为其传值,且必须被传值   
      6.可变参数*args与关键字参数kwargs通常是组合在一起使用的,如果一个函数的形参为*args与kwargs,那么代表该函数可以接收任何形式、任意长度的参数  
    

    名称空间与作用域

    名称空间

      1.名称空间即存放名字与对象映射/绑定关系的地方。对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系。
      2.内建名称空间:解释器
      3.全局名称空间:pyhton文件
      4.局部名称空间:函数内或者类体内
    

    作用域

      1.全局作用域:位于全局名称空间、内建名称空间中的名字属于全局范围,该范围内的名字全局存活(除非被删除,否则在整个文件执行过程中存活)、全局有效(在任意位置都可以使用)
      2.局部作用域:位于局部名称空间中的名字属于局部范围。该范围内的名字临时存活(即在函数调用时临时生成,函数调用结束后就释放)、局部有效(只能在函数内使用)
    

    查找优先级

      1.在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,没有找到,再去全局作用域查找:先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常
      2.在全局作用域查找名字时,起始位置便是全局作用域,所以先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常
      3.可以调用内建函数locals()和globals()来分别查看局部作用域和全局作用域的名字,查看的结果都是字典格式。在全局作用域查看到的locals()的结果等于globals()
      4.Python支持函数的嵌套定义,在内嵌的函数内查找名字时,会优先查找自己局部作用域的名字,然后由内而外一层层查找外部嵌套函数定义的作用域,没有找到,则查找全局作用域
      5.在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,若要在函数内修改全局名称空间中名字的值,当值为不可变类型时,则需要用到global关键字
      6.当实参的值为可变类型时,函数体内对该值的修改将直接反应到原值
    

    函数对象

      1.函数可以被引用
      2.函数可以作为容器类型的元素
      3.函数可以作为参数传入另外一个函数
      4.函数的返回值可以是一个函数
    

    闭包函数

      1.也就是说函数被当做数据处理时,始终以自带的作用域为准。若内嵌函数包含对外部函数作用域(而非全局作用域)中变量的引用,那么该’内嵌函数’就是闭包函数,简称闭包(Closures)
      2.“闭”代表函数是内部的,“包”代表函数外’包裹’着对外层作用域的引用。因而无论在何处调用闭包函数,使用的仍然是包裹在其外层的变量
      3.用来给函数体内部传值的
    

    装饰器

    为何要用装饰器

    可扩展性更高

    什么装饰器

      1.函数装饰器分为:无参装饰器和有参装饰两种,二者的实现原理一样,都是’函数嵌套+闭包+函数对象’的组合使用的产物
      2.无参装饰器
      Ⅰ.def outter(func):
            def wrapper(*args,**kwargs):
                  res = func(*args,**kwargs)
                  return res
            return wrapper
      Ⅱ.f = outter(index)
      Ⅲ.@outter
      3.有参装饰器
      Ⅰ.def auth(x):
            def deco(func):
                  def wrapper(*args,**kwargs):
                        res = func(*args,**kwargs)
                        return res
                  return wrapper
            return deco
      Ⅱ.@deco(x="")
    

    迭代器

    什么是迭代器

    1.迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代
    2.可迭代对象(Iterable)。从语法形式上讲,内置有__iter__方法的对象都是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象
    3.调用obj.iter()方法返回的结果就是一个迭代器对象(Iterator)。迭代器对象是内置有iter和next方法的对象,打开的文件本身就是一个迭代器对象,执行迭代器对象.iter()方法得到的仍然是迭代器本身,而执行迭代器.next()方法就会计算出迭代器中的下一个值。 迭代器是Python提供的一种统一的、不依赖于索引的迭代取值方式,只要存在多个“值”,无论序列类型还是非序列类型都可以按照迭代器的方式取值

    生成器

    什么是生成器

      若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象
      生成器内置有__iter__和__next__方法,所以生成器本身就是一个迭代器
    

    如何用生成器

      1.有了yield关键字,我们就有了一种自定义迭代器的实现方式。yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,而yield可以保存函数的运行状态挂起函数,用来返回多次值
      2.使用方法
      Ⅰ.def eater():
            print('ready to eat')
            while Ture:
                  food = yield
                  print('get the food: %s, and start to eat' % food)
      Ⅱ.g = eater()
      Ⅲ.next(g)
      Ⅳ.g.send('包子')
      3.针对表达式形式的yield,生成器对象必须事先被初始化一次,让函数挂起在food=yield的位置,等待调用g.send()方法为函数体传值,g.send(None)等同于next(g)
      4.表达式形式的yield也可以用于返回多次值,即变量名=yield 值的形式
    

    表达式与生成式

    三元表达式

      res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
    

    列表生成式

      [for i in [1,2,3,4,5] if i < 4]
    

    生成器表达式

      (for i in [1,2,3,4,5] if i < 4)
    

    函数递归

      1.函数不仅可以嵌套定义,还可以嵌套调用,即在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或间接地调用该函数本身
      2.使用递归,我们只需要分析出要重复执行的代码逻辑,然后提取进入下一次递归调用的条件或者说递归结束的条件即可,代码实现起来简洁清晰
    

    函数式编程

      1.lambda x,y:x + y
      2.max(salary,key=lambda k:salary[k])
      3.map(lambda x:x**2,arr1)
      4.filter(lambda x:x<5,arr1)
      5.reduce(lambda x,y:x+y,arr1)
    

    模块

    导入相关

      1.导入模块发生的三件事
      Ⅰ.执行源文件代码
      Ⅱ.产生一个新的名称空间用于存放源文件执行过程中产生的名字
      Ⅲ.在当前执行文件所在的名称空间中得到一个名字,该名字指向新创建的模块名和要引用模块名称空间中的名字,需要加上该前缀
      2.加上foo.作为前缀就相当于指名道姓地说明要引用foo名称空间中的名字,所以肯定不会与当前执行文件所在名称空间中的名字相冲突,并且若当前执行文件的名称空间中存在x,执行foo.get()或foo.change()操作的都是源文件中的全局变量x
      3.需要强调一点是,第一次导入模块已经将其加载到内存空间了,之后的重复导入会直接引用内存中已存在的模块,不会重复执行文件,通过import sys,打印sys.modules的值可以看到内存中已经加载的模块名
      4.​ 当然,我们也可以在函数内导入模块,对比在文件开头导入模块属于全局作用域,在函数内导入的模块则属于局部的作用域
      5.解决循环导入的问题:将导入的语句放到最后,保证在导入时,所有名字都已经加载过;或者将导入语句放到函数中
    

    搜索模块的路径与优先级

      在导入一个模块时,如果该模块已加载到内存中,则直接引用,否则会优先查找内置模块,然后按照从左到右的顺序依次检索sys.path中定义的路径,直到找模块对应的文件为止,否则抛出异常。sys.path也被称为模块的搜索路径,它是一个列表类型
      一个Python文件有两种用途,一种被当主程序/脚本执行,另一种被当模块导入,为了区别同一个文件的不同用途,每个py文件都内置了__name__变量,该变量在py文件被当做脚本执行时赋值为“__main__”,在py文件被当做模块导入时赋值为模块名
    

    time与datetime模块

      1.分类:时间戳、格式化的时间字符串、结构化的时间
      2.时间戳:time.time()
      3.结构化时间:time.loacltime()
      4.格式化字符串:time.strtime("%Y-%m-%d")
    

    random模块

      1.ranom.random(0,1) 大于0小于1之间的小数
      2.random.randint(1,3) 大于等于1且小于等于3之间的整数
      3.random.randrange(1,3) 大于等于1且小于3之间的整数   
      4.random.choice() 从列表中选一个
      5.random.sample() 从列表中任意选2个组合
      6.random.uniform(1,3) 大于1小于3的小数
      7.random.shuffle() 打乱list的顺序,相当于洗牌
    

    os模块

      os模块是与操作系统交互的一个接口
      1.os.path.abspath()
      2.os.path.join()
    

    sys模块

      1.sys.argv 命令行参数list,第一个元素是程序本身路径
      2.sys.exit() 退出程序
      3.sys.version
      4.sys.maint
      5.sys.path
      6.sys.platform
    

    shutil模块

      1.高级的文件、文件夹、压缩包处理模块
    

    json和pickle模块

      1.json.dump和pickle.dumps
      2.json.load和pickle.loads
    

    shelve模块

      shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型
    

    xml模块

      xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml
    

    configparser模块

      1.config = configparser.ConfigParser()
      2.config.read()
      3.config.sections()
      4.config.options('section')
    

    hashlib模块

      1.特点
      Ⅰ. 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验
      Ⅱ.不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码
      Ⅲ.只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的
      2.用法
      Ⅰ.m = hashlib.md5()
      Ⅱ.m.update("hello".encode("utf8"))
      3.把一段很长的数据update多次,与一次update这段长数据,得到的结果一样,但是update多次为校验大文件提供了可能
      4.真正用的时候要"加盐"处理
    

    subprocess模块

      subprocess.Popen('ls /Users/jieli/Desktop',shell=True,stdin=,stdout=subprocess.PIPE)
    

    logging模块

      1.日志配置字典[见文件]
      2.import settings
      3.import logging.config
      4.logging.config.dictConfig(settings.LOGGING_DIC)
      5.logger1=logging.getLogger('用户交易')
      6.logger1.info('egon儿子alex转账3亿冥币')
    

    re模块

      ![](https://img2020.cnblogs.com/blog/2229169/202012/2229169-20201229151931147-1493649254.png)
      1.re.findall() 返回所有满足条件的结果,放在list里面
      2.re.serarch() 只找到一个匹配然后返回匹配信息的对象
      3.re.match() 从头开始匹配
      4.re.split() 按照正则切分
      5.re.sub() 替换
      6.group的作用是将所有组拼接到一起显示出来
  • 相关阅读:
    程序员 你中毒了吗?
    Win8 下安装 Live Writer 发布博客
    Rational Rose 2003 下载及破解方法(转载)
    如何在dos 下使用csc.exe命令?
    as 与 is
    【转载】关于工资的三个秘密
    C#反射(1)<转>
    C#常用字符串格式
    微软企业库EntLib5.0使用过程中常见的异常
    关于window7 AERO 声音 IIS 无线网络失效的解决办法
  • 原文地址:https://www.cnblogs.com/qijiaxun/p/14205853.html
Copyright © 2011-2022 走看看