python基础复习

python基础复习

一、变量与常量

  • 变量的定义与使用

    • 变量值 = 变量名
  • 变量的命名规则

    • 1、数字、字母、下划线的组合
    • 2、不能以数字开头
    • 3、不能重名关键字
  • 变量命名类型

    • 大驼峰命名法(类)
    • 小驼峰命名法
    • 下划线命名法(方法)
  • 变量值的三大特性

    • id():变量值在内存中的内存地址
    • type():变量值的数据类型
    • value:变量值本身
  • 常量的定义

    • 在python中并没有明确规定常量的定义语法
    • 我们一般使用变量名全大写,作为常量名
    • 常量即在整个项目运行过程中都不会发生改变的值,例如:HTTP状态码
    • PI = 3.14..

二、数据类型

  • number数字类型

    • 数据类型分为

      • int(number/unicode, base=10):整型
      • float(number):浮点型
      • complex(number):复数
    • 进制转换

      • bin(number):转换为二进制
      • oct(number):转换为八进制
      • hex(number):转换为十六进制
  • string字符串类型

    字符串类型的定义: 
        使用单引号、双引号、三引号,将对象括起的,就是字符串
    
    • 判断

      • startswith(str, start, end):判断str是否为指定范围字符串中第一个字符
      • endswith(str, start, end):判断str是否为指定范围字符串中最后一个字符
      • isalpha():判断字符串是否为纯字母组合
      • isalnum():判断字符串是否为字母、数字组合
      • isupper():判断字符串是否为纯大写字母
      • islower():判断字符串是否为纯小写字母
      • istitle():判断字符串是否为每个单词首字母均大写,且其他字符均小写
      • isdigit():判断字符串是否为bytes、unicode组合
      • isdecimal():判断字符串是否为纯unicode编码值
      • isnumeric():判断字符串是否为unicode、中文、罗马数字组合
      • isspace():判断字符串是否为纯空白字符组合
    • 修改

      因为字符串类型为不可变数据类型,所以对其的所有修改操作,都会返回一个修改后的结果,而不会修改原字符串
      
      • replace(old, new, count=None):使用new字符替换old字符,count指定次数,默认全部替换
      • ljust(width, chars=None):指定字符串宽度(字符串超出无影响),字符串宽度小于width时,使用chars指定的字符来在字符串右侧填充
      • rjust(width, chars=None):指定字符串宽度(字符串超出无影响),字符串宽度小于width时,使用chars指定的字符来在字符串左侧填充
      • center(width, chars=None):指定字符串宽度(字符串超出无影响),字符串宽度小于width时,使用chars指定的字符来在字符串两侧填充
      • zfill(width):指定字符串宽度(字符串超出无影响),字符串宽度小于width时,使用数字0来在字符串两侧填充
      • strip(chars=None):去除字符串两侧重复的chars字符,不指定则默认去除空白字符
      • rstrip(chars=None):去除字符串右侧重复的chars字符,不指定则默认去除空白字符
      • lstrip(chars=None):去除字符串左侧重复的chars字符,不指定则默认去除空白字符
      • lower():将字母全小写
      • upper():将字母全大写
      • title():将单词首字母全大写,单词内字母均小写
      • 'str'.join(iterable):将可迭代对象使用str字符拼接,返回拼接后的字符串
      • expandtabs(tabsize=8):指定字符串中\t的空格数,python中默认一个\t四个空格
    • 查找

      • len(str):获取字符串中字符个数
      • str[index]:获取字符串中指定index字符
      • str[start: end: step]:获取字符串中指定区间字符
      • find(sub, start, end):在限定范围内,获取第一个sub字符所在下标,如果不存在则返回-1
      • rfind(sub, start, end):在限定范围内,获取最后一个sub字符所在下标,如果不存在则返回-1
      • index(sub, start, end):在限定范围内,获取第一个sub字符所在下标,如果不存在则抛出异常
      • rindex(sub, start, end):在限定范围内,获取最后一个sub字符所在下标,如果不存在则抛出异常
      • count(sub, start, end):计算指定范围内,sub字符出现的次数
      • split(sub, maxspilt=-1):将字符串中,sub字符作为分隔符,返回一个列表,maxspilt指定分隔次数,-1代表无限大
      • rsplit(sub, maxspilt=-1):将字符串中,sub字符作为分隔符,反向分隔,返回一个列表,maxspilt指定分隔次数,-1代表无限大
      • partition(sub):将字符串以sub字符为根,分隔为(sub字符前, sub, sub字符后),返回一个元组
      • rpartition(sub):将字符串以sub字符为根,反向分隔为(sub字符前, sub, sub字符后),返回一个元组
      • splitlines(keepends=False):以字符串中\n为分隔符,返回一个列表,keepends指定是否保留\n,False为不保留
    • 转移字符

      在原生字符前加\,就会将该字符转换为其他功能
      	\\
          \'
          \''
          \f
          \t
          \n
          \v
          \r
      	r''
          R''
      在字符串前加r/R,可以阻止其内部转移功能,只能输出原生字符串
      
    • 格式化字符串

      • format()

        {}
        'zzw{}, ceshi{}, hehe{}'.format(1, 2, 3)
        # 'zzw1, ceshi2, hehe3'
        
        {int}
        'zzw{1}, ceshi{3}, hehe{2}'.format('a', 'b', 'c')
        # 'zzwa, ceshc, heheb'
        
        {命名关键字}
        'zzw{name}, ceshi{age}, hehe{height}'.format(age=14, height=13, name=12)
        'zzw12, ceshi14, height13'
        
      • %

        %s	 					通用的占位符
        %d 						数字的占位符
        	%nd					n限定数字长度,不足使用空格在数字前面补全
            %-nd				n限定数字长度,不足使用空格在数字后面补全
            %'str'nd			n限定数字长度,不足使用'str'在数字前面补全
        %f						浮点数的占位符
        	%.nf				.n限定浮点数的小数位数(保留多少小数位)
        %x						数字的占位符,输出时,将数字转换为小写16进制
        %X						数字的占位符,输出时,将数字转换为大写16进制
        %%						输出%
        
        
  • boolean布尔类型

    • False/True

    • bool(obj):将obj转换为bool类型

      • False:空字符串、空字典、空集合、空列表、空元组、0、None、False、
  • list列表类型

    • 增加

      • append(obj):将obj添加到列表末尾
      • insert(index, obj):将obj添加到列表index前
      • extend(iterable):将iterable中的元素遍历添加到列表末尾
    • 删除

      • clear():删除列表
      • remove(value):删除列表中value值,返回None
      • pop(index):删除列表中index的值,并返回value
      • del list:删除变量与列表的引用
    • 修改

      • list[index] = value
    • 查询

      • len(list):获取列表中元素个数
      • index(value, start, end):指定范围,value对应的index
      • obj in/not in list:判断obj是否存在list中,返回bool
      • count(value):计算value在list出现次数
    • 排序

      • [::-1]:反向排序
      • reverse():反向排序
      • sort(key=func, reverse=False/True):将列表由大到小排序,reverse=True代表排序完后,再反向排序。key代表当元素存在字典时,指定字典中进行比较的值
      • sorted(iterable, key, reverse):与sort基本一致,区别在于sorted不会改变原有列表,而是生成新列表
    • 列表推导式

      • [i for i in range(1, 10) if i % 2 == 0]
      • [(x, y) for x in range(1, 10) for y in range(20, 30)]
  • tuple元组类型

    • 查询

      • len(tuple):获取元组元素个数
      • in/not in:判断对象是否存在元组中,返回bool
      • index(value, start, end):获取value在元组中下标
      • count(value):返回value出现次数
      • 下标/切片方式
    • 增加

      • tuple1 + tuple2:将tuple2中的元素逐个添加到tuple1的末尾,将执行结果返回一个新元组,不会修改原元组
  • set集合类型

    • 集合特点

      • 不可重复性

      • 无序性

        • 如果集合内所有元素均是number类型,那么会自动从小到大排序
      • 集合内元素必须为不可变数据类型

    • 增加

      • add('不可变数据类型'):将数据添加到集合随机位置
      • union(iterable):将iterable中的元素跌打添加到集合随机位置,并将执行结果返回一个新集合,对原集合不会修改
      • update(iterable):将iterable中的元素跌打添加到集合随机位置,修改原集合
    • 删除

      • clear():删除集合
      • pop():随机删除集合中一个元素,并返回元素值
      • remove(element):删除集合中指定元素
      • del set:取消变量名与集合的引用关系
    • 查看

      • len(set):获取元素个数
    • 集合与运算符

      以下操作并不会修改原集合
      
      • set1 - set2:去交集,将set1中与set2重复的部分去除
      • set1 & set2:交集,返回set1与set2重复的部分
      • set1 | set2:并集,返回set1与set2合并
      • set1 ^ set2:差集,返回set1与set2不重复部分的合并
      • set1 >/>= set2:判断set1是否为set2父集,返回bool
      • set1 </<= set2:判断set1是否为set2子集,返回bool
  • dictionary字典类型

    字典的key必须为不可变数据类型
    字典的value可以是任何数据类型
    如果key重复,则后面覆盖前面
    
    • 增加

      • dict[key] = value:增加k-v
      • update(dict):将dict中的k-v均添加到当前dict中
      • fromkeys([key1, key2, ...], value):清除dict中所有k-v,并设置k1...的value均为value
      • setdefault(key, defalut=None):如果key存在,则返回value值,如果不存在则创建,使用default作为value
    • 删除

      • del dict:取消引用
      • clear():删除字典
      • popitem():随机删除一对k-v,以元组形式返回
      • pop(key, default=None):key存在,则删除,返回value,key不存在,则返回default值
    • 修改

      • dict[key] = value
    • 查找

      • len():获取字典中key个数
      • in/not in:判断object是否是字典中某个key
      • get(key, default=None):获取key对应的value,如果不存在则使用default值作为返回值
      • keys():返回dict_keys([所有key])
      • values():返回dict_values([所有value])
      • items():返回dict_items([(k,v),....])
  • 通用方法

    • 内置函数

      • str(obj)
      • bool(obj)
      • len(obj)
      • set(iterable)
      • list(iterable)
      • tuple(iterable)
      • dict(**kwargs, zip)
      • enumerate(iterable)
    • 算术运算符

      • +:tuple、number、string、list
      • -:set
      • *:number、string、list、tuple
      • in/not in:string、list、tuple、set、dictionary

三、字符串编码

'''
ASCII --> Latin1 --> Unicode

1. 计算机只能够识别机器语言,即0/1,为了实现人类常用语与机器语言的对应关系,方便存取数据

2. 早期设计了一种数字、字母、符号与二进制的对应关系表,即ASCII码表。ASCII编码表使用7位二进制表示一个字符,它的区间范围是0-127,一共只能表示128个字符,仅能支持英语。

3. 随着计算机科学的发展,西欧语言、希腊语、泰语、阿拉伯语、希伯来语等语言的字符也被添加到码表中,形成了一个新的码表ISO8859-1(又被称之为Latin1码表)。ISO8859-1使用8位二进制表示一个字符串,完全兼容ASCII码表

4. 到如今的时代,在Latin1码表的基础上再次延申发展出了统一的编码规则:Unicode
	Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等
    Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
'''
    
    
chr(编码值)	--->	返回编码值在unicode中对应的字符
ord(字符)		--->	返回字符在unicode中对应的编码值


'''
使用Unicode为每种语言的每个字符都设定了唯一的二进制编码,但是他还是会存在一定的问题,不够完美。

例如:汉字"你"转换成一个字符结果就是`0x4f60`,转换成二进制就是`01001111 01100000`,此时就出现两个问题:

1. `01001111 01100000`到底是一个汉字'你',还是两个Latin1字符?
2. 如果Unicode进行了规定,每个字符都使用n个八位来表示,对于Latin1字符来说,又会浪费很多的存储空间

为了解决这个问题,就出现了一些编码规则,按照一定的编码规则对Unicode数字进行计算,得出新的编码。在中国常用的字符编码有`GBK`,`Big5`和`utf8`这三种编码规则:

    GBK:国标扩,汉字占两个字节,简体中文

    Big5:繁体中文

    utf-8:统一编码,汉字占三个字节
'''
encode('编码规则')	--->	将字符串按照'编码规则'进行编码成bytes
decode('编码规则')	--->	将编码后的bytes按照'编码规则'进行解码

bytes('str', encoding='编码规则')	--->	将str字符串按照encoding编码规则进行编码,并返回bytes类型的数据

四、垃圾回收机制GC

1、垃圾回收前置知识

'''
内存相关:
	堆区:直接存放变量值数据本身
    栈区:存放变量名与变量值内存地址关系
 


直接引用:从栈区出来,直接能够获取到变量值
间接引用:从堆区出来,还需要继续跳转才能获取到变量值
'''

2、垃圾回收机制原理

'''
解释器在执行到定义变量的语法时,会申请内存空间来存放变量值,而内存容量是有限的

但从逻辑层面分析,我们定义变量的作用就是为了后续调用变量名去取出变量值,而变量名是通过直接引用/间接引用的关系来关联变量值的,如果一个变量值不存在任何直接引用/间接引用关系,那么他就应该被回收内存空间

垃圾回收机制GC是Cpython解析器提供的自动的垃圾回收机制,专门用来回收不可用的变量值所占用的内存空间


python的GC模块主要运用了以下:
	引用计数:来跟踪和回收垃圾
    标记-清除:在引用计数的基础上,可以通过标记清除来解决循环引用问题
    分代回收:通过分代回收来以空间换取时间的方式来提高垃圾回收的效率。
'''
  • 引用计数

    • 当一个变量值被直接/间接引用,则引用计数+1
    • 当一个变量值得引用计数为0时,那么它所占内存空间就应该被回收
  • 循环引用问题

    • 引用计数机制存在着一个致命的弱点,即循环引用(也称交叉引用)
    • 当我们使用容器类型来互相引用时,即便清除了变量名与容器之间的引用关系,但容器与容器之间依然存在引用,从而导致引用计数不为0,无法被回收
    • 在这种情况下,我们需要标记-清除来解决循环引用问题
  • 效率问题

    • 基于引用计数的回收机制,每次回收内存,都需要把所有对象的引用计数都遍历一遍,这是非常消耗时间的,于是引入了分代回收来提高回收效率,分代回收采用的是用“空间换时间”的策略。
  • 标记-清除

    • 当应用程序可用的内存空间被耗尽的时,就会停止整个程序,然后进行两项工作,第一项则是标记,第二项则是清除

      • 标记:标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,其余的均为非存活对象,应该被清除。
      • 清除:清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。
  • 分代回收

    • 分代:分代回收的核心思想是:在历经多次扫描的情况下,都没有被回收的变量,gc机制就会认为,该变量是常用变量,gc对其扫描的频率会降低
    • 回收依然是使用引用计数作为回收的依据
'''
解释器在执行到定义变量的语法时,会申请内存空间来存放变量值,而内存的容量是有限的

从逻辑层面上将,我们定义一个变量的作用就是为了后续的调用,而调用变量名就是调用它的直接/间接引用关系来获取内存中存储的变量值,对于一个变量值,如果不存在直接/间接引用关系,那么它就因该被当作垃圾回收

GC机制是Cpython解释器的特性,可以自动的帮助我们回收内存中的不再使用的变量值的内存空间(垃圾)

GC机制主要通过以下三个方面进行:
	引用计数:
		对于变量值,如果存在直接/间接引用关系,那么引用计数+1
		对于引用计数为0的变量值,我们应该回收它的内存空间
	
	循环引用问题:(交叉引用)
		对于容器类型,它内部存放对于变量值的间接引用
		如果两个容器类型交叉间接引用对方的内存地址
		那么,即使清楚了他们所关联的直接引用,依然存在容器之间的间接引用关系
		从而引用计数无法归0,一直占用内存空间
	
	标记-清除:
		当内存空间被占满时,立刻停止当前进程,执行以下两个步骤
		标记:遍历所有栈区中的对象,对于栈区中能够直接/间接引用的变量值,标记为存活
		清除:遍历所有堆区中的对象,对于堆区中没有标记存活的变量值,回收其内存空间
	
	效率问题:
		我们在运行一个程序时,不可能都等到它内存空间占满时再执行标记清除动作
		但又不能频繁的遍历堆区、栈区中的对象,从而浪费计算机资源
		在此情况下,出现了分代回收概念
	
	分代回收:
		分代:对于多次遍历下,依然存活的变量值,我们将其划为下一代,减少其遍历频率
		回收:正常回收机制
'''

五、可变数据类型/不可变数据类

什么是可变数据类型?
	set、list、dictionary
	修改变量值,则内存地址不会发生改变的
 
什么是不可变数据类型?
	number、string、tuple
	修改变量值,内存地址会发生改变
    对于两个不可变数据类型,他们的变量值完全一样,则代表他们指向同一块内存地址

六、深/浅复制

什么是深复制?
	对于容器类型,它内部往往存放的元素有可能是间接引用,尤其是对于容器类型之间的嵌套
    对于此情况,我们在复制一个容器类型时,往往只能复制其外层嵌套,对于内层嵌套的容器只能复制其内存地址,而不是数据本身
    可以使用copy模块中的deepcopy来实现深复制
    import copy
    copy.deepcopy(obj)

什么是浅复制?
	对于复制一个对象,没有完全将其源数据复制一份,而是有可能复制了其内部数据的内存地址
    对于此情况,当修改源数据时,我们复制的数据也会发生改变,这是及其不利的
    可以使用.copy 和 copy模块中的copy实现浅复制
    import copy
    copy.copy(obj)
    obj.copy()

七、输入输出语句

print()输入语句

print(obj, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
'''
obj:填入的需要输出的对象,可以是多个,需要使用逗号分隔
sep:多个对象之间的分隔符号,默认空格
end:print语句结束符,默认\n
file:print语句输出位置,默认sys.stdout,即终端命令行,可以设置为open对象
flush:设置是否缓存,默认False,该参数只有在file是open文件时才有效,如果设置为True,则文件传输到一半会断流
'''

input()输出语句

input('提示信息')
在终端命令行显示 '提示信息': 
在输入了数据后,按回车生效

八、基本运算符

  • 算术运算符

    + - * / %  // ** ()
    
  • 比较运算符

    > >= < <= != == 
    
  • 赋值运算符

    # 将左侧的内存地址赋值给右侧
    = 
    
    # 增量赋值
    -= += *= /= %= **= //=
    
    # 链式赋值
    a=b=c=10
    
    # 解压赋值
    a, b = [1, 2]
    a, *b = [1, 2, 3, 4]
    
    # 交叉赋值
    a, b = b, a
    
  • 逻辑运算符

    not 	逻辑非
    and 	逻辑与
    or		逻辑或
    
    逻辑运算符的短路问题:
    	一旦有结果,则直接返回结果,不会继续比较
        
    逻辑运算符的优先级:
    	not > and > or
    
  • 成员运算符

    in			
    	# obj1 in obj2 判断哦obj1是否是obj2对象的成员,返回bool值
    not in
    
  • 身份运算符

    is			
    	# obj1 is obj2 判断obj1关联的内存地址是否与obj2关联的内存地址一致,返回bool值
    is not
    
  • 位运算符

    &		按位与,都为1才为1
    	'''
    	'0b111110'		--> 62
        '0b011110'		--> 30
        
        '0b011110'		--> 30
    	'''
    |		按位或,有1则为1
    	#0b111110	--> 62
    ^		按位异或,不同则为1
    	#0b100000	--> 32
    ~		按位取反,-x-1
    	#~30 		--> -31
        #-0b11111	--> -x-1
    	
    <<		左移
    	#30 << 3	--> 240	-->  '0b11110000'
    >>		右移
    	#30 >> 3	--> 3	-->	 '0b11'
    

    九、流程控制

    • 分支结构

      • if ... else

        if 13 > 14:		# 放入条件判断
            pass
        else:
            pass
        
      • if ... elif .. else

        if not 13 and 14:
            pass
        elif 14 > 13:
            pass
        else:
            pass
        
      • if语句存在区间判断

      • if语句存在隐式类型转换

      • if语句三元表达式

        a = 10 if 10 > 11 else 11
        # a = 11
        
    • 循环结构

      • for

        for i in range(1, 10):	# 放入可迭代对象
            pass
        
        
        for i in range(1, 10):
            pass
        else:		# for循环正常执行完毕后执行的语句
            pass
        
      • while

        while True:
            pass
        
        while True:
            pass
        else:		# while循环正常执行完毕后执行的语句
            pass
        
    • break/continue/pass关键字

      break:直接终结当前循环,且不执行后续else语句
      continue:跳过本次循环
      pass:占位,无任何意义
      

     

九、文件处理

  • 打开文件

    open('文件路径', mode='打开模式', encoding='编码格式')
    
    '''
    我们需要了解,文件它是存储在磁盘中,以二进制形式存放的,当我们需要获取一个文件数据时
    	首先需要将磁盘中文件数据加载到内存
    	然后内存以特定的编码格式(默认以当前系统编码格式)编码
    	将编码后的数据加载到程序/进程中
    	
    文件路径:
    	绝对路径:直接填写完整的根目录
    		C:\\xxx\\xxx\\...
    	相对路径:以当前py文件所处目录为根
    		./当前目录
    		../上一级
    		
    mode:
    	r:只读模式
    	w:只写模式
    		1. 当我们使用w模式打开一个已存在文件时,会自动清空文件内容
    		2. 当我们使用w模式打开一个不存在文件时,会自动创建文件
    	a:追加写模式
    		1. 追加写模式不会清除文件内容,而是会在末尾换行增加数据
    	t:文本打开(默认)
    	b:二进制打开
    		1. 在b模式下无需添加encoding参数
    	+:合并模式
    	U:通用换行模式(不推荐)
    	
    encoding:
    	windows:GBK
    	linux:UTF-8
    	需要注意:打开文件与写入文件的编码格式需要一致
    '''
    
  • 读取数据

    • read()/readline()/readlines()

      f = open('', mode='r', encoding='utf8')
      f.read(1024)
      	# 读取文件内所有内容,返回字符串
      f.readline(1024)
      	# 读取文件内当前光标所在行的内容,返回字符串
      f.readlines(1024)
      	# 读取文件内所有内容,返回列表,一行代表一个元素
      
      '''
      如果rt:1024代表取出的字符数
      如果rb:1024代表取出的字节数
      '''
      
  • 写入数据

    • write()

      f = open('', mode='w', encoding='utf8')
      f.write(str/bytes)
      '''
      如果wt:则直接写入字符串即可,内部会进行自动按照encoding进行编码,如果不给定encoding参数,则默认使用当前系统的编码格式
      如果wb:则直接写入编码后的二进制即可
      '''
      
  • 控制游标

    • seek(offset, 0/1/2)

      f = open('', mode='r', encoding='utf8')
      f.seek(offset, 0/1/2)
      
      '''
      offset:	偏移量,单位字节
      	0:默认模式,以文件开头作为参照
      	
      以下两个方式需要rb模式下,才能使用
      	1:以当前光标所在,作为参照
      	2:以文件末尾作为参照
      '''
      
    • tell()

      f = open('', mode='r', encoding='utf8')
      f.tell()	
      # 获取当前光标距离文件首位的字节数
      
  • 关闭文件

    • close()

      f = open('', mode='r', encoding='utf8')
      f.close()
      
  • with关键字

    with关键字可以实现自动关闭文件操作
    
    with open('', mode='r', encoding='utf8') as f:
        f.xxx
    

十、函数基础

  • 函数的基本语法

    def 函数名():
        '''
        方法描述
        '''
      	....
        return
    
    # 函数名的命名规范也遵徐变量名的命名规范
    # 函数名指向函数的内存地址,是对函数代码的引用,命名需看名知意
    
    函数调用的三种形式:
    	1. 直接调用
        函数名()
        2. 作为参数传递
        xxx(函数名())
        3. 表达式形式
        xxx = 函数名()	
        xxx = 函数名	# 此刻 xxx关联的内存地址就是此函数封装代码的内存地址,调用xxx()就是调用函数
        
    函数的三要素:
    	1. 参数
        2. 函数名
        3. 返回值
    
  • 函数的参数

    • 参数顺序:位置参数, 默认参数, *args, 命名关键字参数, **kwargs,

    • 参数的数据类型:在python中不会限制参数的数据类型,只作为一个提示的功能

      def xxx(a:int, b:float, c:string):
          pass
      
    • 位置参数:按照形参位置,顺序传入实参

      def xxx(a, b, c):
          pass
      
      xxx(1, 2, 3)
      
    • 默认参数:如果不给定参数,则使用默认的值

      def xxx(a=10):
          pass
      
    • 可变参数:可接收任何位置参数,使用元组存储

      def zzw(a,b,*c):
          print(a,b,c,type(c))
      zzw(1,2,3,4,5,6,7)
      # 1 2 (3, 4, 5, 6, 7) <class 'tuple'>
      # 对应的可变参数使用元组存储
      
    • 命名关键字参数:我们有时候需要定义,一些参数必须使用 k=v 的形式来传值

      def register(name,age,*,sex,height): #sex,height为命名关键字参数
      	pass
      # 被定义为命名关键字的参数,必须 以 k=v 的形式传值,否则报错!
      
      register('lili', 18, sex='male', height='1.8m') 
      # 正确使用
      
    • 可变长关键字参数:可以接收任何关键字参数,使用字典存储

      def foo(x,**kwargs): #在最后一个参数kwargs前加**
           print(x)        
           print(kwargs)   
       
      foo(y=2,x=1,z=3) 
      # 溢出的关键字实参y=2,z=3都被**接收,以字典的形式保存下来,赋值kwargs
      # 1
      # {'z': 3, 'y': 2}
      
    • 参数的组合:定义顺序必须是:位置参数、默认参数、*args、命名关键字参数、**kwargs

  • 函数的返回值

    • 一个return语句,可以使用逗号隔开,返回多个值,使用元组存储
    • 一个函数只能有一个return语句,除非使用finally关键字
    • return语句就是代表函数的执行结束
  • 函数的注释

    • 可以使用help()内置函数来查看函数内部的注释
  • 全局变量/局部变量

    • 全局变量:在整个py文件内均生效
    • 局部变量:只能在局部生效,如函数内部定义的变量,只能在函数启动时生效,结束时回收
    • globals():查看对象的全局变量,以字典的形式返回
    • locals():查看当前作用域内的局部变量,以字典的形式返回
  • 名称空间

    • 内建名称空间:随python解释器的启动而生成,结束而回收,用于存储python解释器内置的名称
    • 全局名称空间:随py文件的执行而产生,结束而回收,用于存储py文件内的全局变量名
    • 局部名称空间:随函数的启动而产生,结束而回收,用于存储函数内部的局部变量
  • 作用域

    • 全局作用域:全局名称空间+内建名称空间的所有名字,在整个py文件的任何位置均生效
    • 局部作用域:局部变量仅能在函数执行时的内部生效
  • global、nonlocal关键字

    • global:声明变量为全局变量

      a = 100
      def zzw():
          global a    # 使用global对变量进行声明,可以通过函数修改全局变量的值
          a = 10    # 此时,全局变量的值变为10
          print('函数内部:',a)
      zzw()
      print('函数外部:',a)
      # 函数内部: 10
      # 函数外部: 10
      
    • nonlocal:声明当前变量向外跨越一层

      def  f1():
          x=2
          def f2():
              nonlocal x
              x=3
          f2() # 调用f2(),修改f1作用域中名字x的值
          print(x) # 在f1作用域查看x
      
      f1()
      
      # 结果
      3
      
      # nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常
      

十一、高阶函数

  • 递归函数

    # 核心原理:函数内部不停调用自己
    # 需要找到结束内调的出口
    
    def ceshi():
        i = 0
        i += 1
        print(i)
        if i == 10:
            return
       	ceshi()
     
    ceshi()
    
  • 匿名函数

    # python中使用lambda关键字来定义匿名函数
    a = lambda x, y: x + y
    print(a(1, 2))	# 3
    
  • 函数嵌套

    # 函数的内部还可以继续嵌套函数
    def ceshi1():
        def ceshi2():
            def ceshi3():
                xxx
    
  • 闭包函数

    # 在一个函数内部再定义一个函数,然后使用return返回该函数的内存地址,实现封装一个函数的作用
    
    def ceshi1():
        def ceshi2():
            pass
        return ceshi2
    
    a = ceshi1()
    # 此刻 a = ceshi2的内存地址
    
    # 返回当前函数内部调用的所有局部函数的内存地址,以元组的形式返回
    a.__closure__
    
    # 调用该局部变量的内存地址,获取结果
    a.__closure__[0].cell_contents
    
  • 装饰器

    # 核心原理,将被装饰的函数当作参数传入到装饰器中,返回一个装饰后的方法
    # 可以实现在不改变原有代码的情况下,对代码进行性能测试、插入日志等
    def ceshi1(func):
        def ceshi2():
            func()
            print('ceshi2')
        return ceshi2
    
    @ceshi1
    def func1():
        print('func1')
        
    func1()
    '''
    返回结果:
    	func1
    	ceshi2
    
    原先:func1 = func1函数内存地址
    装饰:
    	func1 = ceshi1(func1函数内存地址)
    		--> ceshi2函数的内存地址
    		--> ceshi2内部的func()相当于是func1函数的执行结果
    最终:func1 = ceshi2函数内存地址,内部存在func1函数的执行结果
    '''
    
  • 多层装饰

    # 装饰器并不是可以添加一个,也可以添加多个
    def ceshi1(func):
        def ceshi2():
            func()
            print('ceshi2')
        return ceshi2
    
    def ceshi3(func):
        def ceshi2():
            func()
            print('ceshi2')
        return ceshi2
    
    def ceshi4(func):
        def ceshi2():
            func()
            print('ceshi2')
        return ceshi2
    ...
    
    ...
    @ceshi4
    @ceshi3
    @ceshi1
    def func1():
        print('func1')
        
    func1()
    '''
    相当于:
    	func1 = ceshi4(ceshi3(ceshi1(func1的内存地址)))
    
    '''
    
  • 有参装饰器

    def xxx(a, b)
        def ceshi1(func):
            def ceshi2(*args, **kwargs):
                func((*args, **kwargs)
                print('ceshi2', a, b)
            return ceshi2
    	return ceshi1()
    
    @xxx(1, 2)                 
    def func1(*args, **kwargs)
    	print(args)
                     
                     
    func1(3, 4, 5 ,6)
    '''
    (3, 4, 5 ,6)
    ceshi2 1 2
    '''
    
  • property关键字

    property关键字可以实现对象内部将方法装饰为属性,且额外增加增删改查
    
    class xxx:
        def __init__(self):
        	self.name = 'list'
        
        @property
        def get_name(self):
            pass
        
       	@get_name.getter
        def get_name(self):
            return self.name
        
        @get_name.setter
        def get_name(self, value):
            self.name = value
            return self.name
        
        @get_name.deleter
        def get_name(self, value):
            return None
    a = xxx()
    a.get_name			# 触发 @get_name.getter
    a.get_name = 13 	# 触发 @get_name.setter,传入value
    del a.get_name 		# 触发 @get_name.deleter
    

十二、常用的内置函数

python3存在68个内置函数

  • number

    • 数字类型

      • int()
      • float()
      • complex()
    • 进制转换

      • bin()
      • oct()
      • hex()
    • 数学计算

      • abs()
      • pow(a, b)
      • round(a, b)
      • divmod(a, b)
      • sum(iterable)
      • max(iter)
      • min(iter)
  • string

    • str(obj)

    • 切片对象: slice(start: end: stop)

    • 执行python指令

      • eval()
      • exec()
      • compile(str, '', 'eval/exec')
    • 输出字符串:repr()

    • 格式化字符串:format()

  • 编码

    • chr()
    • ord()
    • ascii()
  • byte

    • byets(str, encoding='')

    • bytearry(str, encoding='')

    • memoryview(byte)

      • tobytes
      • tolist
  • bool

    • bool(obj)
    • any(iter)
    • all(iter)
  • list

    • list(iter)
    • 列表排序: sorted(iterable, key, reverse)
    • 压缩列表:zip(iter, iter...)
  • set

    • set(iter)
    • 冰冻集合: frozenset(iterable)
  • dictionary

    • dict(iter)
  • tuple

    • tuple(iter)
  • 可迭代对象

    • next()

    • 迭代器

      • iter()
      • 翻转迭代器:reversed()
      • 生成序列迭代器:range()
      • 迭代加工:map(func, iter)
      • 迭代过滤:filter(func, iter)
  • 对象

    • dir()

    • vars()

    • object()

    • property()

    • 继承相关

      • isinstance(obj, (class, ...))
      • isinsubclass(class, (class, ...))
      • super()
    • 特殊对象:enumerate()

    • 文件对象:open()

    • 模块导入:__import__()

    • 反射:

      • getattr(obj, 'name', default)
      • setattr(obj, 'name', 'new')
      • delattr(obj, 'name')
      • hasattr(obj, 'name')
    • 对象修饰符

      • @classmethod
      • @staticmethod
  • 函数

    • 是否可调用:callable()
    • 局部变量:locals()
    • 全局变量:globals()
  • 输入输出

    • print()
    • input()
  • 其他:

    • id()
    • type()
    • help()
    • hash()
    • exit()

 

posted @ 2021-07-07 15:43  zzwYYYYYY  阅读(185)  评论(0)    收藏  举报