Python学习笔记

Python学习笔记

1.起步

print("Hello world")
  1. 输入:

    # 单个输入
    b=input()
    # input()接受的是string类型,需要使用数据类型转化
    # 多个输入,使用分割字符串的方式
    b=map(int,input().split(' '))
    
  2. 输出:

    # 输出
    print(1,2,34)
    # 当遇到,是会空格显示
    

2.变量和简单的数据类型

1.变量

  1. 声明:

    a="heloo"
    

2.字符串

  1. 用单引号和双引号都可
a="hhhh";
a.title(); #首字母大写
a.upper()  #全部大写
a.lowper() #全部小写
b=a+"ooo"  #字符串合并用+
c="mm " 
c.rstrip() #删除空白
d=" dad"
d.lstrip() #删除前面的空白
d.strip()  #删除后面的空白
# 但删除并不是真正的删除
d=" hjhsad"
print(d.rstirp); #显示hjhsad
print(d)         #显示 hjsad

3.数字

  1. python支持正常的加减乘除

    1*2 # 2
    1/2 # 1.5
    3+2 # 5
    3-2 # 1
    
  2. 要注意不同的浮点数相加可能不会得到正确答案

    0.1+0.2 # 0.30000000000000004
    
  3. 使用str()避免类型错误

    month=1
    day=2 
    print("生日是"+str(month)+"月"+str(day)+"日") #生日是1月2日
    

4. 注释

  1. 单行注释用 #

    #这是一个单行注释
    
  2. 多行注释用三个单引号或双引号

    '''
    这是一个多行注释
    '''
    """
    这是一个多行注释
    """
    

3.列表

1.声明

a=["hahdh","sdas","red",120]
print(a) #['hahdh', 'sdas', 'red', 120]

2. 访问列表元素

a=["hahdh","sdas","red",120]
print(a[0].upper()) #HAHDH
print(a[-1]) # 120 a[-1]是最后一个元素

3.修改,添加和删除元素

name=["lihua","xiaoming","xiaogou","xiaohong"]
# 插入元素
name.append("xiaohu") #在末尾添加元素 "xiaohu"
name.insert(4,"hhh") #4是下标,在name[4]的地方添加元素"hhh"原来的元素往后移
# 删除元素
del name[3] # 删除name[3]所在的元素
a=name.pop(3) #删除name[3]所在元素的同时,将该删除元素赋给a
name.remove("lihua") '''删除值为"lihua"的元素,但他只删除第一个,如果后面还有值为"lihua"的元素就需要用循环来做'''

4.组织列表

1. 排序

  • 永久性排序,使用sort()

    a=['a','c','b','f','e']
    print(a) #['a', 'c', 'b', 'f', 'e']
    a.sort() #使用sort是顺序排列从a-z
    print(a) #['a', 'b', 'c', 'e', 'f'] 
    b=['a','c','b','f','e'] 
    print(b) #['a', 'c', 'b', 'f', 'e']
    b.sort(reverse=True) #使用sort(reverse=True)是逆序排列 从z-a
    print(b) #['f', 'e', 'c', 'b', 'a']
    
  • 临时性排序,sorted()

    a=['a','c','b','f','e']
    print(sorted(a)) #['a', 'b', 'c', 'e', 'f'] 顺序
    print(a)         #['a', 'c', 'b', 'f', 'e']
    print(sorted(a,reverse=True)) #['f', 'e', 'c', 'b', 'a'] 逆序
    print(a)                    #['a', 'c', 'b', 'f', 'e']
    
    
  • 要反转列表元素的排列顺序,可使用方法reverse() 。

    a=['a','c','b','f','e']
    print(a) #['a', 'c', 'b', 'f', 'e']
    a.reverse() #反转列表排列顺序
    print(a) #['e', 'f', 'b', 'c', 'a']
    
    • 注意,reverse() 不是指按与字母顺序相反的顺序排列列表元素,而只 是反转列表元素的排列顺序
    • 方法reverse() 永久性地修改列表元素的排列顺序,但可随时恢复到原 来的排列顺序,为此只需对列表再次调用reverse() 即可

2.确定列表长度

  • 使用函数len() 可快速获悉列表的长度

    a=['a','c','b','f','e']
    c=len(a)
    print(c) #5
    

5.操作列表

1.遍历整个列表

  • for循环

    for+变量+in +遍历结构:
      语句块1 
    else:
      语句2
    
  • 遍历列表

    a=['a','c','b','f','e']
    for i in a:
        print(i)
    

2.创建数字列表

  • 使用函数range()

    # 打印数字
    for i in range(1,5):
        print(i) 
    # i 实际会显示 1-4
    
    • 函数range() 让Python从你指定的第一个值开 始数,并在到达你指定的第二个值后停止,因此输出不包含第二个值
  • 使用函数range()创建数字列表

    a=list(range(1,5))
    print(a) #[1, 2, 3, 4]
    
    • 使用函数range() 时,还可指定步长

      # 打印十以内的偶数
      a=list(range(0,10,2)) # 2是步长
      print(a) #[0, 2, 4, 6, 8]
      
    • 打印1-10的平方

      a=[] #创建空列表
      for i in range(1,11):
          a.append(i**2)
      print(a) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
      
  • 对数字列表执行简单的统计计算

    a=list(range(1,11))
    print(max(a)) #最大值
    print(min(a)) #最小值
    print(sum(a)) #求和
    
  • 列表解析

    # 用列表解析打印1-10的平方
    a=[i**2 for i in range(1,11)]
    

3.使用列表的一部分

  • 切片:

    c=list(rang(1,10))
    print(c[0:4]) #[1, 2, 3, 4]
    print(c[:5])  #[1, 2, 3, 4, 5]
    print(c[2:])  #[3, 4, 5, 6, 7, 8, 9]
    print(c[:])   #[1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(c[-3:]) #[7,8,9] 打印后面三个元素
    
    • 要创建切片,可指定要使用的第一个元素和最后一个元素的索引(Python在到达你指定的第二个索引前面的元素后停止)
    • 如果你没有指定第一个索引,Python将自动从列表开头开始
    • 如果你没有指定第二个索引,Python将要让切片终止于列表末尾,且最后一个元素打印
    • 如果两个索引都省略,则打印全列表
    • 负数索引返回离列表末尾相应距离的元素,因此 你可以输出列表末尾的任何切片
  • 遍历切片

    # 获取列表的最大值
    c=list(range(0,11))
    c.sort(reverse=True)
    print(c[0:3])
    for a in c[0:3]:
        print(a)
    
  • 复制列表

    c=list(range(1,11))
    d=c[:]
    print(c) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print(d) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

4.例题

  • 打印消息“The first three items in the list are:”,再使用切片来打 印列表的前三个元素

    s='The first three items in the list are:'
    d=[]
    b=0
    for a in range(len(s)):
        if s[a]==' ':
            d.append(s[b:a])
            b=a
    print(d[0:3])
    

5.元组

  1. 定义:在python中将不能修改的值称为不可变的,而不可变的列表成为元组

  2. 声明:

    a=(111,222)
    
  3. 遍历元组

    for i in a:
        print(i)
    
  4. 修改元组的值

    a=(111,222)
    a=(111,333)
    
    • 无法单独修改元组元素
    • 但可以重新定义该元组
  5. 小练习-自助餐

    # 自助餐小练习
    a=('西红柿炒鸡蛋','红烧茄子','兰州拉面','红烧肉','鱼香肉丝')
    # 显示当前菜单
    print('当前菜单为:')
    for i in a:
        print("\t\t"+i)
    # 修改菜单
    a=('可乐鸡翅','红烧茄子','蛋炒饭','红烧肉','鱼香肉丝')
    # 显示修改的菜单
    print('修改后的菜单为:')
    for i in a:
        print("\t\t\t"+i)
    

6.设置代码格式

  1. 缩进用四个空格
  2. 每行的行长不超过80个字符
  3. 合理使用空格组织程序

6.列表推导式

  1. 意义:

    旧列表推导出所列表

  2. 格式:

    """
    [表达式 for 变量 in 旧列表] 或者 [ 表达式 for 变量 in 旧列表 if 条件]
    """
    
  3. 例子:

    names=['tom','lily','abc','jack','steven','bob','ha']
    # 过滤掉长度小于或者等于3的人名
    result=[name.capitalize() for name in names if len(name)>3]
    print(result)
    # 求1~100之间能被3和5整除的数
    newlist=[i for i in range(1,101) if i %3 ==0 and i%5==0]
    print(newlist)
    # 推导式的多重循环
    newlist2=[(x,y) for x in range(5) if x%2==0 for y in range(10) if y%2!=0]
    print(newlist2)
    # 获取多个列表的最后一个列表
    list1=[[1,2,3],[4,5,6],[7,8,9],[1,3,5]]
    newlist3=[i[-1] for i in list1]
    print(newlist3)
    # 推导式的if-else结构
    """
    例题:工资大于等于5000的加200,小于5000的加500
    dict1={'name':'tom','salary':5000}
    dict2={'name':'lucy','salary':8000}
    dict3={'name':'jack','salary':4500}
    dict4={'name':'lily','salary':3000}
    """
    dict1={'name':'tom','salary':5000}
    dict2={'name':'lucy','salary':8000}
    dict3={'name':'jack','salary':4500}
    dict4={'name':'lily','salary':3000}
    list2=[dict1,dict2,dict3,dict4]
    newlist4=[employee['salary']+200 if employee['salary']>=5000 else employee['salary'] +500 for employee in list2]
    
    print(newlist4)
    
  4. 延伸:

    1. 集合推导式:

      """
      格式:{表达式 for 变量 in 旧列表} 或者 { 表达式 for 变量 in 旧列表 if 条件}
      类似于列表推导式,在列表推导式的基础上添加了一个去除重复项的功能
      """
      # 例子:
      list3=[1,2,3,2,3,5,6,1]
      set1={x for x in list3}
      print(set1)
      
    2. 字典推导式:

      
      

4.字典

1. 声明

alien_0={
    'color':'red',
    'points':5
}

2.使用字典

  1. 在python中,字典用放在花括号{}中的一系列的键值对表示

  2. 访问字典中的值

    print(alien_0['color'])
    
  3. 添加键值对

    alien_0['x_position']=0
    alien_0['y_position']=25
    
  4. 创建空字典

    alien_1={}
    alien_1['color']='red'
    alien_1['points']=5
    
  5. 修改字典中的值

    alien_1['color']='green'
    
  6. 删除键值对

    # 使用del删除
    del alien_1['color']
    

3. 遍历字典

  1. 遍历字典的所有的键值对

    for k,v in alien_0.items():
     print(k+'=>'+str(v))
    
  2. 遍历字典的所有键

    for key in alien_0.keys():
     print(key)
    
  3. 遍历字典的所有值

    for value in alien_0.values():
     print(value)
    # 获得非重复的所有值
    for value in set(alien_0.values()):
     print(value)
    

4.嵌套

  1. 列表嵌套字典(字典列表)

    alien_0={
     'color':'green',
     'points':5
    }
    alien_1={
     'color':'green',
     'points':5
    }
    aliens=[alien_0,alien_1]
    for alien in aliens:
     print(alien)
    
  2. 在字典中储存列表

    aliens={
     'alien_0':['green',5],
     'alien_1':['red',10]
    }
    for alien in aliens.items():
     print(alien)
    
  3. 字典的嵌套

    name={
     'lihua':{
         'fast_name':'hua',
         'last_name':'li'
     },
     'xiaoming':{
         'fast_name':'xiao',
         'last_name':'ming'
     }
    }
    

5流程控制和函数

流程控制

  1. 选择结构

     if a == 0:
         print('I`m 0')
     elif a == 1:
         print('I`m 1')
     else:
         print('I`am not 1 or 0')
    
  2. for循环结构

     a=['1',5,6]
     for c in a:
         print(c)
    """
    for···in 用来迭代序列类型或字典
    """
    
  3. while循环

     while i>0:
         print(i)
         i-=1
     else:
         print(0)
    """
    while 也存在else分支。值得注意的时while循环正常结束或者使用continue时,会执行else。但当使用break结束时,则else分支不执行
    """
    

函数

  1. 定义:

    def people (name,age):
        """
        语句
        """
    
  2. 函数的参数:

    必备参数,关键词参数,默认参数,不定长参数

    def people (name,age,height=1.8,*like,**family):
        """
        必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
        关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。例如 people(....age=0....)
        调用函数时,默认参数的值如果没有传入,则被认为是默认值。例如height
        不定长参数:你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数。加了星号(*)的变量名会存放所有未命名的变量参数。例如参数like
        一个*的参数类是元组,两个*的参数类型是字典例如people('farther'='lihua')
        """
    
  3. 函数的调用和返回

    # 调用 函数名(参数)
    people()
    
    # 返回值 用return返回
    
  4. lambda函数

     a=lambda x,y:x*y
     print(a(1,2))
    

6.类和对象

  1. 类的定义:

    class ClassName(father class name):
        
    # ClassName表示为自定义类名,statement是类成员表达式,既可以为属性也可以为方法
    # father class name shijicheng 是继承的父类名
    
  2. 类的实例化:

    直接调用类名方法创建

  3. 类的方法:

    • 类方法的第一个参数必须是self
    • 类方法里面调用类本身的属性和方法都必须在属性和方法前面加self
    • 类方法的名字开头可以为下划线或者字母,不可以为其他字符。如果类方法名字的开头为两个下划线并且结尾不为两个下划线,就是私有方法。私有方法就是只能为类的其他方法调用的方法
  4. 类的特殊方法

    • 类的初始化函数和析构函数:

      • __init__:

        在类被实例化为对象是调用的函数

      • __del_:

        在对象被del操作符从内存中卸载时所调用的函数

    • 类的操作符方法:

      操作符方法就是让类支持加减乘除等各种运算的方法

  5. 类的继承:

    1. 定义:继承又称泛化,是使一个类获得另一个类所有属性和方法的能力,被继承的类称为父类或基类

    2. 继承语法:

      class 类名 (父类)
      
    3. 单一继承:一个子类只有一个父类

    4. 多重继承:一个子类有好几个父类

    5. 重载:

      对于单一继承来说,自定义的方法B会覆盖继承的方法B

      对于多重继承来说,重载的顺序是从右往左的,在同名的方法中保留的是第一父类的方法

  6. 类的关联和依赖

    1. 依赖

      在代码上为依赖的类的某个方法以被依赖的类作为参数

      class Person(object):
        def gobyboat(self,boat):
            boat.overriver()
      class Boat(object):
        def overriver(self):
            pass
      a=Person()
      b=Boat()
      a.gobyboat(b)
      
    2. 关联

      一个类作为另一个类的成员属性

      class student(object):
        name="lihua"
        age=18
      class school:
        def __init__(self):
            self.students=student()
      
  7. 类的聚合和组合

    1. 区别:聚合和组合都是关联的特例,它们的区别在于聚合的两个对象是可分离的,他们有各自的生命周期组合往往表现为唇亡齿寒

    2. 例子:

      class a(object):
        pass
      class b(object):
        pass
      class c(object):
        A=a()
        B=b()
      class d(object):
        B=b()
      # a和c是组合,b和c则是聚合
      

7.异常捕获和抛出

  1. 异常处理

    • Traceback:由信息头,出错位置,异常信息三部分组成

      • 信息头:提醒使用者这是个Traceback信息
      • 出错位置:一般异常信息的位置在最下面
      • 异常信息:显示异常的类型
    • 捕获异常:

      用 try....except语法

      try:
          statements 1
      except A:
          statements 2
      """
      语法规则:先运行statements 1,如果没有异常则直接运行之后的代码。若存在异常,则把异常类型与类型A进行比较,结果一致就执行statement2
      """
      
    • 多重异常处理:

      try:
          statements 1
      except A,B:
          statements 2
      except C,D:
          statements 3
      except:
          statements 4
      
    • except衔接else和finally的使用:

      try:
          statements 1
      except A:
          statements 2
      else:
          statements 3
      finally:
          statements 4
      """
      else的作用是:当statements 1发生异常时,则else的statements 3不会运行
      finally的作用是:无论statements 1是否发生异常,statements 4都会运行
      """
      
    • 获得异常参数

      try:
          statements 1
      except A as e:
          statements 2
      # e为异常的参数
      
  2. 常见的异常类型:

    1. InderError:列表元素不存在
    2. KeyError:访问字典中不存在的key
    3. IOError:一个不存在的文件或者其他I/O错误
    4. NameError:一个不存在的变量名
    5. TypeError:一个类型使用一个不支持的操作
    6. ZeroDivisionError:被除数为0
  3. 抛出异常:

    • 语法:

      # 1 raise后接实例化对象
      raise NameEroor("aa")
      # 2 raise后接异常名
      raise NameError
      # 3 raise后接异常对象和类的初始化参数来实例化对象
      raise NameError("aa")
      
  4. 自定义异常类型:

    class a(Exception):
     def __init__(self,value):
         self.value=value
     def __str__(self):
         return repr(self.value)
     
    

8.模块和包

  1. 模块:单个py文件

    # mian.py的代码如下:
    def sayHello():
     print('hello')
    
    # 第一种导入方法
    import main as a
    a.sayHello()
    # 第二种导入方法
    from main import sayHello
    sayHello()
    # 第三种导入方法
    from main import (sayHello)
    sayHello()
    # 第四种导入方法(将所有的成员导入当前模块)
    from main import *
    sayHello()
    
  2. 包:一组模组的集合,即存放若干个python文件的目录

    • 创建people包:
包.png
  • __init__.py导入所有模组

    import people.sayHello
    import people.sayAge
    __all__=['sayHello','sayAge']
    
  • 调用包

    import people
    people.sayHello.sayHello()
    people.sayAge.sayAge()
    
  • 包的导入:

    前三种导入方法与模组的导入类似,但第四种的导入存在不同

    不同:

    __init__.py代码:

    import people.sayHello
    import people.sayAge
    __all__=['sayHello','sayAge']
    """
    若设置了一个__all__列表,当执行form people import *时,他会根据__all__列表的模组名进行导入
    若没有设置,则form people import *不会导入任何子模组
    """
    

9.元类和新型类

1.元类:

  1. 使用type创建类:

    """
    type(类名,继承的父类,命名空间(属性,方法))
    """
    #创建类
    def sell(self):
     print(self.hobby)
    # hobby="hello"
    Hello=type('Hello',(),{'sell':sell,
                           'hobby':"hello"})
    #实例化类
    hello=Hello()
    hello.sell()
    
  2. 元类概念:类的类,类就是元类的实例

  3. 元类的创建:

     # 元类的创建
        class change(type):
         def __new__(cls, name, bases, dict):
             def test_msg(self):
                 print("this test_msg is changed")
    
             dict["test_msg"] = test_msg
             return type.__new__(cls, name, bases, dict)
         # 元类的实例化
     class example(metaclass=change):
         def __init__(self):
             print("this is test_msg!")
    
         def test_msg(self):
             print("this is test_msg")
    

2.新型类

  1. 定义:继承与object的类

  2. 静态方法,类方法和普通方法的区别

     class A(object):
         numbers=18
         @staticmethod
         def b():
             print("hello ,I`m static b")
    
         @classmethod
         def c(cls):
             print("hello ,I`m classmethod c "+str(cls.numbers))
    
         def d(self):
             print("hello ,I`m d")
    
实例方法(普通方法) 类方法 静态方法
实例调用a=A() a.d() 可以调用 a.c() a.b()
类调用A 不可以调用 A.c() A.b()
  1. 新型类的特定方法

    1. __new_____init__方法

      • ___new___方法:

        当一个类实例化时,首先调用__new__方法来返回该类的实例

      • __init__方法:

        当调用__new__方法后,然后调用```init``方法来初始化这个实例

      • 例如

        class A(object):
            def __new__(cls,name,age):
                cls.name=name
                cls.age=age
                return object.__new__(cls)
            def __init__(self,name,age):
                print("我被创建了!!!")
        
        
        a=A("lihua",18)
        print(a.name)
        print(a.age)
        
    2. __GETATTRUBUTE__方法

      • 新型类调用属性和方法时,都会先调用该方法
      class a(object):
        def test(self):
            print("this is test")
        def __getattribute__(self, name):
            print("this is to"+name)
            return object.__getattribute__(self,name)
      A=a()
      A.test()
      
    3. 新型类的特定属性

      内建property类用来绑定类实例的方法,并将其返回值绑定为一个类属性

      语法如下:

      attrib=property(fget=None,fset=None,fdel=None,doc=None)
      """
      假设设在一个类C中如上定义了 attrib属性(通过 property来创建的),而x是C的一个实例,那么当引用 x attrib时, Python会调用fget0方法取值:当为x.attrib=value时, Python会调用 fset()方法,并且 value值作为fsetO方法的参数:当执行 del x.attrib时,Python调用 fdel()方法,传过去的名为doc的参数即为该属性的文档字符串。如果不定义fset()和 fuel()方法,那么 attrib将是一个只读属性
      """
      

      例子:

        class Rectangle(object):
            def __init__(self,height,width):
                self.width=width
                self.height=height
            def getArea(self):
                return self.width * self.height
            area=property(fget=getArea,doc="area of the rectangle")
      
        rectangle=Rectangle(5,6)
        print(rectangle.area)
      
    4. 类的super()方法

      • 单个继承:

        主要是调用父类的方法的

      • 多个继承:

10.迭代器,生成器和修饰器

1.迭代器

  1. 定义:

    迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,知道所有元素被访问结束,迭代器只能往前不会后退。

  2. 内置方法:

    • 方法iter():返回对象本身,是for语句使用迭代器的要求
    • 方法next():用于返回容器中下一个元素或数据,当使用完容器中的数据时会引发StopIteration异常
  3. 创建并使用迭代器

    """
    迭代类的属性,该类为2的n次方
    """
    class Use:
     def __init__(self, x=2, max=50):
         self.mull, self.x = x, x
         self.max = max
    
     def __iter__(self):
         return self
    
     def __next__(self):
         if self.x and self.x != 1:
             self.mull *= self.x
             if self.mull <= self.max:
                 return self.mull
             else:
                 raise StopIteration
         else:
             raise StopIteration
    if __name__=='__main__':
     use=Use()
     for x in use:
         print(x)
    

    注意:在Python程序中使用迭代器类时,一定要在某个条件下心法StopIteration错误。这样可以结束遍历,否则会陷入死循环

  4. 使用内置迭代器协议方法iter()

    """
    有两种使用iter()的方法
    第一种是:iter(iterable)
    第二种是:iter(callable,sentinel)
    对上述两种使用方法的具体说明如下所示
    第一种只有一个参数 iterable,要求参数为可送代的类型,也可以使用各种序列类型
    第二种:具有两个参数,第一个参数 callable表示可调用类型,一般为函数:第二个参数 sentinel是一个标记,当第一个参数(函数)调用返回值等于第二个参数的值时,送代或遍历会马上停止。
    """
    """
    迭代序列
    """
    if __name__=='__main__':
     # 第一种用法
     a=[1,2,3]
     it=iter(a)
     for x in it:
         print(x)
    
     # 第二种用法
     class Counter:
         def __init__(self,x=0):
             self.x=x
     counter=Counter()
     def user_iter():
         counter.x+=2
    
         return counter.x
    
     for i in iter(user_iter,12):
         print('当前遍历的数值为:',i)
    

2.生成器

  1. 生成的运行机制:

    在 Python程序中,生成器是一个记住上一次返回时在函数体中位置的函数。对生成器函数的第二次(或第n次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变生成器不仅“记住”了它的数据状态,还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。
    概括来说,生成器的特点如下所示。
    (1)生成器是一个函数,而且函数的参数都会保留。
    (2)当送代到下一次的调用时,所使用的参数都是第一次所保留下的。也就是说,在整个函数调用的参数都已第一次所调用时保留的,而不是新创建的

  2. 创建生成器

    def shengYield(n):
     while n>0:
         print('开始生成')
         yield n
         print('生成结束')
         n-=1
    
    if __name__=='__main__':
     # 可以使用for循环来进行迭代
     for i in shengYield(4):
         print(i)
    
     # 可以使用next()进行人工的方法进行遍历
     sheng_Yield=shengYield(3)
     print(sheng_Yield.__next__())
     print(sheng_Yield.__next__())
     print(sheng_Yield.__next__())
     print(sheng_Yield.__next__())
    
  3. 生成器的第一次调用

    在第一次调用生成器时,不能传送给生成器None以外之的值

  4. 使用协程重置生成序列

    """
    使用协程重置生成器序列
    """
    def xie():
     print('其他队员等待接受处理任务...')
     while True:
         data=(yield )
         print('收到任务:',data)
    
    def producer():
     c=xie()
     c.__next__()
     for i in range(3):
         print('游泳名将x杨发送了一个任务...','任务%d'%i)
         c.send('任务%d'%i)
    
    if __name__=='__main__':
     producer()
    

3.装饰器

  1. 创建装饰器

    @ zz
    def han_fun():
     pass
    
  2. 使用装饰器修饰函数

    """
    使用装饰器修饰无参的函数
    """
    def zz(fun):
     def wrapper(*args,**bian):
         print('比赛开始了')
         fun(*args,**bian)
         print('比赛结束了')
     return wrapper
    
    @zz
    def demo_decoration(x):
     a=[]
     for i in range(x):
         a.append(i)
     print(a)
    @zz
    def hello(name):
     print('Hello',name)
    
    if __name__=='__main__':
     demo_decoration(5)
     print()
     hello('中国跳水梦之队')
    """
    装饰器修饰有参数函数
    """
    def zz(func):
     def aa(a,b):
         sum=func(a,b)
         print(sum)
     return aa
    @zz
    def sum(a,b):
     return a+b
    
    if __name__=='__main__':
     a,b=map(int,input().split(' '))
     sum(a,b)
        
    """
    使用装饰器修饰类 
    """
    def zz(myclass):
     class A:
         def __init__(self,z=0):
             self.z=z
             self.wrapper=myclass()
         def postion(self):
             self.wrapper.postion()
             print('z轴的坐标为',self.z)
     return A
    @zz
    class a:
     def __init__(self,x=0,y=0):
         self.x=x
         self.y=y
     def postion(self):
         print('x轴的位置',self.x)
         print('y轴的位置',self.y)
    
    if __name__=='__main__':
     c=a()
     c.postion()
    

4.命名空间

  1. 命名空间的本质

    在Python中一般分为三种命名空间:局部命名空间,全局命名空间,内置命名空间

  2. 查找命名空间

    在Python程序中,当某一行代码要使用变量x的值时,会用到所有可用的名字空间去查找这个变量,按照如下所示的顺序进行查找:局部命名空间,全局命名空间,内置命名空间,如果还没有则引发NameError异常。

    对于嵌套函数的命名空间来说,查找顺序为:当前函数的命名空间,父函数的命名空间,模块命名空间,内置模块命名空间

  3. 命名空间的生命周期

    • 内置命名空间在 Python解释器启动时创建,会一直保留下去,不会被删除
    • 模块的全局命名空间在模块定义被读入时创建,通常模块命名空间也会一直保存
      解释器退出
    • 当函数被调用时创建一个局部命名空间,当函数返回结果或抛出异常时被删除。每一个递归调用的函数都拥有自己的命名空间。
  4. 命名空间访问函数locals()和globals():

    • 访问局部变量时,选用locals()。访问全局变量时采用globals()。
    • 在 Python程序中, locals实际上没有返回局部名字空间,它返回的是一个拷贝。所以对
      它进行改变对局部名字空间中的变量值并无影响。而 globals返回实际的全局名字空间,而
      不是一个拷贝。所以对 globals所返回的 dictionary I的任何改动都会直接影响到全局变量

5.闭包

  1. 定义:

    在Python中一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个函数B就叫做闭包。你调用函数A时,传递的参数就是一个自由变量

11.文件操作处理

1.文件操作基础

  1. open()函数:

    在Python中可以通过open函数来打开文件。

    """
    open()函数的常用形式时接受两个参数即open(file,mode='r')
    """
    open('a.txt', mode='r')
    
    """
    open()函数的完整语法格式为:
    """
    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    

    参数说明:

    • file: 必需,文件路径(相对或者绝对路径)。
    • mode: 可选,文件打开模式
    • buffering: 设置缓冲
    • encoding: 一般使用utf8
    • errors: 报错级别
    • newline: 区分换行符
    • closefd: 传入的file参数类型
    • opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符

    mode参数有:

    模式 描述
    t 文本模式 (默认)。
    x 写模式,新建一个文件,如果该文件已存在则会报错。
    b 二进制模式。
    + 打开一个文件进行更新(可读可写)。
    U 通用换行模式(不推荐)。
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写

    默认为文本模式,如果要以二进制模式打开,加上 b

2.File对象

  1. File的内置属性:

    属性 描述
    file.closed 返回True如果文件已被关闭,否则返回False
    file.mode 返回被打开文件的访问模式
    file.name 返回文件名称
      foo=open('a.txt', mode='wb')
      print('文件名字:',foo.name)
      print('是否关闭',foo.closed)
      print('访问模式:',foo.mode)
    
  2. File的内置函数

    序号 方法及描述
    1 file.close()关闭文件。关闭后文件不能再进行读写操作。
    2 file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
    3 file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
    4 file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。
    5 file.next()返回文件下一行。
    6 file.read([size])从文件读取指定的字节数,如果未给定或为负则读取所有。
    7 file.readline([size])读取整行,包括 "\n" 字符。
    8 file.readlines([size])读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。
    9 file.seek(offset[,where])设置文件当前位置
    10 file.tell返回文件当前位置。
    11 file.truncate(size)截取文件,截取的字节通过size指定,默认为当前文件位置。
    12 file.write(str)将字符串写入文件,返回的是写入的字符长度。
    13 file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
  3. 常用方法介绍

      #fileno()
      fid=foo.fileno()
      print('文件的描述符是',fid)
      #isatty()
      ret=foo.isatty()
      print('是否连接到终端',ret)
      """
      在Python程序中,File对象不支持方法next()
      在 Python3程序中,内置函数next()通过迭代器调用方法'__next__()'返回下一项。在循环    中,方法 next()会在每次循环中调用,该方法返回文件的下一行。如果到达结尾(EOF),则触发     Stoplteration异常,使用方法next()
      的语法格式如下所示。
      next(iterator[,default])
      """
      for index in range(3):
          line=next(foo)
          print(line)
      #read()
      line2=foo.read(-1)
      print(line2)
      #flush()
      foo.flush()
      #close()
      foo.close()
    

3.使用OS对象

  1. OS对象介绍:

    在Python中File对象只能对某个文件进行操作。但有时需要对某个文件夹目录进行操作,姿势就需要使用OS对象来实现。

    • 常见内置函数
      https://www.runoob.com/python3/python3-os-file-methods.html(懒得弄图片了)
  2. 使用方法access():

    • 功能介绍:

      检验对当前文件的操作权限模式

    • 语法格式:

       os.acces(path,mode)
      
      • 参数“path”:用于检测是否有访问权限的路径
      • 参数“mode”:表示测试当前路径的模式,主要包括四种取值模式。
        • os.F_OK:测试path是否存在
        • os.R_ok:测试path是否可读
        • os.W_ok:测试path是否可写
    • os.X_ok:测试path是否可执行

  • access()有返回值,如果允许访问就返回True,否则返回False
  • 例子:

    import os,sys
    if __name__=='__main__':
       ret=os.access("a.txt",os.F_OK)
       print(ret)
       ret=os.access("a.txt",os.R_OK)
       print(ret)
       ret=os.access("a.txt",os.W_OK)
       print(ret)
       ret=os.access("a.txt",os.X_OK)
    print(ret)
    
  1. 使用方法chdir():
    • 功能介绍:

修改当前工作目录到指定的路径

  • 语法格式

    
    
os.chdir(path)
 ```
   
 - 参数`path`表示要切换的新路径
 - 返回值:允许修改返回True,否则返回False
  • 例子

    import os,sys
    if __name__=='__main__':
       path='people'
       print(os.getcwd())
       os.chdir(path)
       print(os.getcwd())
    
  1. 使用方法chmod()

    • 功能介绍:

      修改文件或目录的权限

    • 语法格式:

      os.chmod(path,flags)
      
      • 参数path:文件名路径或目录路径
      • 参数mode:表示不同的权限级别
        • stat.S_IXOTH: 其他用户有执行权0o001
        • stat.S_IWOTH: 其他用户有写权限0o002
        • stat.S_IROTH: 其他用户有读权限0o004
        • stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007
        • stat.S_IXGRP: 组用户有执行权限0o010
        • stat.S_IWGRP: 组用户有写权限0o020
        • stat.S_IRGRP: 组用户有读权限0o040
        • stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070
        • stat.S_IXUSR: 拥有者具有执行权限0o100
        • stat.S_IWUSR: 拥有者具有写权限0o200
        • stat.S_IRUSR: 拥有者具有读权限0o400
        • stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700
        • stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000
        • stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000
        • stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000
        • stat.S_IREAD: windows下设为只读
        • stat.S_IWRITE: windows下取消只读
      • 无返回值
    • 例子:

      import os,sys,stat
      if __name__=='__main__':
         # 设置文件可以通过用户组执行
         os.chmod("a.txt",stat.S_IXGRP)
         # 设置文件可以被其他用户写入
         os.chmod('a.txt',stat.S_IWOTH)
      
  2. 打开,写入和关闭

    1. open()方法:

      • 功能介绍:打开文件

      • 语法格式:

        os.open(file,mode,flags)
        
        • file:要打开的文件
        • mode:可选参数,默认为0770
        • flags:该参数可以是以下选项,多个使用 "|" 隔开:
          • os.O_RDONLY: 以只读的方式打开
          • os.O_WRONLY: 以只写的方式打开
          • os.O_RDWR : 以读写的方式打开
          • os.O_NONBLOCK: 打开时不阻塞
          • os.O_APPEND: 以追加的方式打开
          • os.O_CREAT: 创建并打开一个新文件
          • os.O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
          • os.O_EXCL: 如果指定的文件存在,返回错误
          • os.O_SHLOCK: 自动获取共享锁
          • os.O_EXLOCK: 自动获取独立锁
          • os.O_DIRECT: 消除或减少缓存效果
          • os.O_FSYNC : 同步写入
          • os.O_NOFOLLOW: 不追踪软链接
        • open()有返回值,返回新打开文件的描述符
    2. 方法write()

      • 功能介绍:写入字符串到文件描述符fd中,返回实际写入的字符串长度

      • 语法:

        os.write(fd,str)
        
        • fd:表示文件描述符
        • str:表示写入的字符串
    3. 方法close():

      • 功能介绍:

        关闭指定文件的描述符fd

      • 语法格式:

        os.close(fd)
        
        • fd:表示文件描述符
        • 无返回值
    4. 实例:

      import os,sys,stat
      if __name__=='__main__':
        """
        打开,写入,关闭
        """
        fd=os.open('a.txt',os.O_RDWR|os.O_CREAT)
        str="你好,我是A"
      
        ret=os.write(fd,bytes(str,'UTF-8'))
      
        os.close(fd)
      
      
  3. 打开,读取,关闭

    • read():

      • 功能介绍:从文件描述符fd中读取最多n个字节

      • 语法格式:

        os.read(fd,n)
        
        • fd:表示文件描述符
        • n:表示读取的字节数
        • 返回一个空字符串
    • 实例:

      import os,sys
      if __name__=='__main__':
         """
         打开,读取,关闭
         """
         fd=os.open('a.txt',os.O_RDWR)
         ret=os.read(fd,5)
         print(ret)
         os.close(fd)
      
  4. 创建目录

    • mkdir():

      • 功能介绍:创建目录

      • 语法格式:

        os.mkdir(path,mode)
        
        • path:表示要创建的一个目录
        • mode:表示为目录设置的权限数字模式
        • 返回值为包含读取字节的字符串
      • 例子

        import os,sys
        if __name__=='__main__':
         path='x'
         os.mkdir(path)
        
    • makedirs()

      • 功能:递归创建目录(可以创建子目录)

      • 语法形式:

        os.makedirs(path,mode=0o777)
        
        • path:表示要递归创建的目录
        • mode:表示为目录设置的权限数字模式
        • 返回值为包含读取字节的字符串
      • 例子

        import os,sys
        if __name__=='__main__':
         path='y/x'
         os.makedirs(path)
        

12.标准库函数

1.字符串处理函数

  1. 分割字符串

    • 内置模块string的split()

      • 语法:

        str.split(str=" ",num=string.count(str))
        # str是需要分割的字符串,num是分割次数若不写则全分割
        
      • 例子:

         sTr="hjgfjdhfkjfdjhsfks dhfjk dfhjkdgkskjfrjebdbjfsjd"
         print(sTr.split()) #默认空字符为分隔符,包括换行“\n”,空格,\t等
         print(sTr.split('d')) # 以d为分隔符,进行全部分割
         print(sTr.split('d',2)) # 以d为分隔符,进行2次分割
        

你可能感兴趣的:(Python学习笔记)