目录python两种模式数据类型基本数据类型列表字典(dict)元组tuple集合逻辑运算符常用语句type()print()基础输出函数注释input其他常用内置函数流程控制if语句for语句while语句函数lambda匿名函数装饰器生成器类型注释文件对象异常类组合__dict__类和对象的属性通过字典进行存放__slots__避免利用字典存放造成空间上的浪费但失去了动态添加属性的功能super()私有变量__开头模块和包四种导入模块方式name main__all__指定的变量和函数可以使用from ... import *语法导入将程序托管到pypi上python两种模式命令行模式将代码写入.py后缀的文件如test.py通过 Python 解释器一次性执行整个文件运行时python解释器会一行一行解析执行交互模式控制台模式输入一行后python立刻执行并返回结果点击PyCharm下方python控制台即可进入或Windows系统中进入cmd命令行输入python3数据类型Python 无需手动声明变量类型解释器会自动识别基本数据类型类型说明示例整数int正负整数、0a 10、b -5、c 0浮点数float带小数点的数x 3.14、y -0.5字符串str文本数据引号包裹name Lili、msg Hi布尔值bool逻辑判断True/Falseis_ok True、is_error FalseNone 类型空值无意义占位result None函数无返回值时默认返回列表用[]定义元素可增删改查支持任意数据类型max(list1) #列表最大值min(list1) #列表最小值sorted(list1) #排序list1.append(1) #新增元素 list1.extend([1,2]) #添加多个元素list1.remove(1) #移除元素 list1.clear() #清除列表中的所有元素len(list1) #返回列表元素的数量# 定义列表 list1 [1, 3, 5, 2, 4] list2 [苹果, 香蕉, 100, True] # 混合类型 # 核心操作 print(list1[0]) # 索引取值1第一个元素 print(list1[1:3]) # 切片[3,5]第2-3个元素 list1.append(6) # 末尾新增元素[1,3,5,2,4,6] list1.remove(3) # 移除指定元素[1,5,2,4,6] list1.sort() # 排序默认升序[1,2,4,5,6] print(max(list1)) # 最大值6 print(min(list1)) # 最小值1 print(len(list1)) # 元素个数51.1创建空列表# 方式1推荐简洁高效 empty_list [] # 方式2用list()函数适合动态生成列表时 empty_list2 list()初始化固定长度的列表counts [0] * 26 # 输出[0,0,...,0]共26个0 [1,2] * 3 # 输出[1,2,1,2,1,2]字典(dict)核心储存键值对类型不可变 用{key: value}定义通过键key查找值valuekey 不可重复且必须是不可变类型如 str、int、tuplecontact {“lili”:123456789, qiqi:234567891} contact[qiqi] #获取键值 contact[w] 123 #新增键 len(contact) #查看键值对数量 del contacts[qiqi] #删除键值对 print(qiqi in contacts) #查询键值是否存在返回bool类型值1.1空字典的创建# 方式1推荐简洁高效 empty_dict {} # 方式2用dict()函数适合动态生成字典时 empty_dict2 dict()1.2默认字典mp collections.defaultdict(list) #Python 内置的默认字典属于collections模块是普通字典dict的增强版解决了 “普通字典访问不存在的 key 会报错” 的问题。指定value的默认类型为list访问不存在的key时自动创建空列表1.3字典对象的转换edict() 将字典转为可通过.访问的对象原生字典只能通过[ ] 访问用.访问报错dict() : 将 edict 对象转回普通字典补充可以用.访问的对象数据类型能否用.访问原因示例原生字典dict不能Python 语法规定字典是键值结构只能用[]访问键d {a:1}; d[a]✅ /d.a❌列表list不能列表是索引结构只能用[]访问索引lst [1,2]; lst[0]✅ /lst.0❌元组tuple不能同列表只能用[]访问索引t (1,2); t[0]✅ /t.0❌自定义类 / 对象可以类的属性 / 方法都通过.访问class A: a1; objA(); obj.a✅edict 对象可以第三方库封装把字典键转为对象属性ed edict({a:1}); ed.a✅argparse 参数对象可以Python 内置参数解析后返回的对象支持属性访问args.input_dir✅元组tuple不可变有序序列无法执行删除、添加等操作适用于固定数据# 定义元组小括号可省略但推荐保留 t1 (1, 2, 3) t2 (键盘, 鼠标, 99.9) t3 (1,) # 单元素元组必须加逗号否则会被识别为普通变量 # 核心操作仅查无增删改 print(t1[0]) # 索引取值1 print(t1[1:3]) # 切片(2,3) print(len(t1)) # 元素个数3 print(max(t1)) # 最大值3集合可变无序不重复集合用{}定义空集合需用set()而非{}常用于去重、交集 / 并集运算s1 {1, 2, 3, 3, 4} # 自动去重{1,2,3,4} s2 set([2, 4, 5, 6]) # 从列表转集合{2,4,5,6} # 核心操作 s1.add(5) # 新增元素{1,2,3,4,5} s1.remove(3) # 删除元素{1,2,4,5} print(s1 s2) # 交集{2,4,5} print(s1 | s2) # 并集{1,2,4,5,6} print(s1 - s2) # 差集{1}逻辑运算符用于连接多个条件遵循「短路原则」and遇到false停or遇true停运算符说明短路规则示例and逻辑与同时成立遇 False 立即返回3 and 4 →返回 4、0 and 3 → 返回0or逻辑或至少一个成立遇 True 立即返回3 or 4 → 返回3、0 or 3 →返回 3not逻辑非取反True ↔ Falsenot True → False常用语句type()返回数据类型a 10 c [1,2,3] print(type(a)) # class int print(type(c)) # class listprint()基础输出函数print( );打印“”间的内容单引号也可 print( )print()可以用拼接print(hello\lili\ )字符中有\解释器会读入\及其后字符最终输出hellolilipython读一行执行一行所以不能随意换行换行可以\n# \n换行符 print(Hello\nLili) # 输出两行Hello 和 Lili # \输出双引号避免与字符串边界冲突 print(Hello \Lili\) # 输出Hello Lili原教程解释错误修正此处 # \t制表符类似键盘 Tab 键 print(姓名\t年龄) # 输出姓名 年龄多参数输出print(姓名, name, 年龄, 20) # 输出姓名 Lili 年龄 20逗号自动加空格 print(1, 2, 3, sep---) # sep 指定分隔符输出1---2---3打印多跨行内容使用三引号print(你好 lili 好久不见了 或print(你好\n\ lili \n\ 好久不见了 \n 注释单行注释#多行快捷注释PyCharm专用选中多行内容ctrl/三引号多行注释“““input返回用户输入内容返回类型为string需手动转换为其他类型current input(用户输入内容)其他常用内置函数函数说明示例len(obj)返回对象长度元素个数len([1,2,3]) → 3、len(abc) → 3enumerate()遍历带索引for i, v in enumerate([1,2]): print(i, v)zip()多序列打包for a,bc in zip([1,2], [3,4],[3,4]): print(a,b,c)range()生成整数序列左闭右开range(1,5) → 1,2,3,4、range(5) → 0,1,2,3,4字典.values()获取字典所有 valuemp {aet:[eat,tea], ant:[tan]}mp.values()→dict_values([[eat,tea], [tan]])list(可迭代对象)转成列表list(mp) [[eat,tea], [tan]].join(列表)列表拼接成字符串作用是 “用指定分隔符这里是空字符串拼接列表中的所有元素”.join([a,e,t]) # 输出aet -.join([a,e,t]) # 输出a-e-t分隔符为-ord(字符)获取字符的 Unicode 编码ord(e) - ord(a) 4流程控制if语句# 基础结构if-else age 16 if age 18: print(未成年) # 缩进4个空格条件成立时执行 else: print(成年) # 条件不成立时执行 # 多条件判断if-elif-else score 85 if score 90: print(优秀) elif score 80: print(良好) # 输出良好 elif score 60: print(及格) else: print(不及格) # 三元表达式简化 if-else print(未成年) if age 18 else print(成年) # 输出未成年for语句使用for循环进行迭代迭代对象可以是列表字典字符串等for 变量名 in 迭代对象#执行语句# 1. 遍历字符串 for char in FISHC: print(char) # 逐个输出F、I、S、H、C # 2. 遍历列表 fruits [苹果, 香蕉, 橙子] for fruit in fruits: print(f水果{fruit}) # 3. range() 函数生成整数序列 # range(开始, 结束, 步长) → 左闭右开 for i in range(1, 10, 2): print(i) # 输出1、3、5、7、9 # 4. 遍历字典结合 items() contact {Lili: 123, Qiqi: 456} for key, value in contact.items(): print(f{key}{value})while语句满足条件时重复执行代码块# 基础示例计数器循环1~5 i 1 while i 5: print(i) # 输出1、2、3、4、5 i 1 # 计数器自增避免死循环 # 死循环需避免除非有退出条件 # while True: # print(无限循环) # break # break 强制退出循环函数1.函数是封装的可复用代码块通过def定义def 函数名():函数体def myfunc(name): print(fI love {name}.)#在字符串前面加上f可通过{}引用变量2.关键字参数位置参数按位置顺序传递1关键字参数按名称传递def myfunc(name, age): print(f姓名{name}年龄{age}) myfunc(nameQiqi, age20) # 输出姓名Qiqi年龄20 myfunc(age20, nameQiqi) # 顺序可乱2位置参数按位置顺序传递def myfunc(name, age): print(f姓名{name}年龄{age}) myfunc(Lili, 18) # 按顺序传递输出姓名Lili年龄18 # myfunc(18, Lili) # 错误类型不匹配3混合使用时位置参数必须在关键字参数之前否则python报错def myfunc(name, age): print(f姓名{name}年龄{age}) myfunc(Wang, age22) # 正确位置参数在前 # myfunc(nameWang, 22) # 错误关键字参数不能在位置参数前def abs(a,/,b,c): #/左侧不支持关键字参数 print(a,b,c) def abs(a,*,b,c): #*右侧只能是关键字参数,相当于匿名的收集参数 print(a,b,c)3.收集参数 形参前* 或***接收任意数量的位置参数以元组形式存储**接收任意数量的关键字参数以字典形式存储def func(*args): #*元组形式的收集参数 print(args) def func(**kwargs): #**字典形式的收集参数 print(kwargs) def func(a,*b,**c): print(a,b,c) func(1,2,3,4,x5,y6) #输出1 (2, 3, 4) {x: 5, y: 6}4.解包参数实参前*将元组解包为位置参数**将字典解包为关键字参数def f2(a,b,c,d): print(a,b,c,d) a (1,2) b {c:5,d:6} f2(*a,**b) #解包参数lambda匿名函数lambda是表达式而非语句可出现在python语法中不允许def语句出现的地方.y [lambda x: x*x,2,3] y[0](y[1]) #将y[1]作为实参传递给匿名函数lambda装饰器装饰器是「接收函数、返回函数」的高阶函数利用闭包保留原函数引用。在不修改原函数代码、不改变函数调用方式的前提下给函数增加额外功能#给一个计算求和的函数新增 “统计执行耗时” 的功能不修改原函数代码 import time # 1. 定义原函数业务逻辑计算1到n的和 def sum_num(n): time.sleep(0.5) # 模拟函数执行耗时 total 0 for i in range(n1): total i return total # 2. 定义装饰器函数核心接收原函数返回新函数 def time_decorator(func): # 闭包wrapper是新函数能访问外部的func def wrapper(*args, **kwargs): # 新增功能1记录开始时间 start time.time() # 执行原函数保留原逻辑 result func(*args, **kwargs) # 新增功能2记录结束时间计算耗时 end time.time() print(f函数 {func.__name__} 执行耗时{end - start:.2f} 秒) # 返回原函数的结果保证原函数调用结果不变 return result # 返回新函数替代原函数 return wrapper # 3. 手动给原函数“贴装饰器” sum_num time_decorator(sum_num) # 4. 调用函数调用方式和原函数完全一样 result sum_num(100000) print(f求和结果{result})用 语法糖简化import time # 1. 定义装饰器 def time_decorator(func): def wrapper(*args, **kwargs): start time.time() result func(*args, **kwargs) end time.time() print(f函数 {func.__name__} 执行耗时{end - start:.2f} 秒) return result return wrapper # 2. 用语法糖给函数贴装饰器 time_decorator # 等价于sum_num time_decorator(sum_num) def sum_num(n): time.sleep(0.5) total 0 for i in range(n1): total i return total # 3. 调用方式不变 result sum_num(100000) print(f求和结果{result})其他例子# 定义装饰器 def log_decorator(func): def wrapper(*args, **kwargs): print(f调用函数{func.__name__}) result func(*args, **kwargs) print(f函数执行完成结果{result}) return result return wrapper # 使用装饰器 log_decorator def add(a, b): return a b add(3, 5) # 输出 # 调用函数add # 函数执行完成结果8装饰器形式def 装饰器名(原函数): def 包装函数(*args, **kwargs): # 新增功能前 结果 原函数(*args, **kwargs) # 新增功能后 return 结果 return 包装函数 装饰器名 def 原函数(): 原逻辑生成器按需生成值不提前占用内存每调用一次提供一个数据并且会记住当前状态而列表元组这些可迭代对象则是容器存放所有已经准备好的所有数据def counter(): i 0 while i 5: yield i i 1可通过next()函数获取生成器的下一个值c counter() print(next(c))for循环遍历生成器的值for i in counter(): print(i) #每次执行到yield i时就生成一个数据暂停并保留状态下一次调用从下一个语句 #i1开始继续执行生成器表达式x ** 2 for x in range(5)它生成一个迭代器按需计算并产生值只有在调用next(c)或遍历生成器时才逐个计算并返回结果类型注释def times(s:str,n:int) - str: #传入参数s是字符串类型,n是整型返回值为字符串类型 return s*n文件对象文件读写f open(data.txt,w) f.write(hello,world) #操作 f.close #等价 with open(data.txt,w) as f: f.write(hello,world)pickle 将python对象序列化转为二进制import pickle x,y,z1,2,3 with open(data.pkl, wb) as f: pickle.dump((x,y,z), f) # 存储数据 with open(data.pkl, rb) as f: x, y, z pickle.load(f) # 读取数据 print(x, y, z,sep---)异常try: #检测范围内的代码块 except #异常处理代码 else #未触发异常时异常处理代码 finally #最终执行raise语句和assert语句主动引发异常assert语句仅可引发一个叫做AssertionError的异常# 1. raise自定义异常 age -1 if age 0: raise ValueError(年龄不能为负数) # 2. assert断言条件不成立时抛AssertionError s hello assert s hello #条件成立无事发生不成立引发异常assertionError类类里面的方法需要一个self参数作为第一个参数 self是实例化对象本身class A(C):继承类Cinstance(b,B):判断对象是否属于某个类 instance(b,B)class C : def hello(self): print(Hello, World!) c C() c.hello() class A(C): def greet(self): print(Greetings from class A!) a A() a.hello() a.greet() isinstance(a, C) # This will return True组合class C : def hello(self): print(C Says Hello!) class B: def hello(self): print(Greetings from class B!) class A: def hello(self): print(Greetings from class A!) class Temp(): a A() b B() c C() def say(self): self.a.hello() self.b.hello() self.c.hello() t Temp() t.say()必须有selfclass C : x 1 def setx(self, v): x v c C() c.setx(2) print(c.x) # 输出为1因为没有绑定self实例 C.x2 # 绑定类属性 print(c.x) # 输出为2因为类属性被修改了 print(c.__dict__) # 输出为{}对象中没有但是生成它的类中有 print(C.__dict__) class A : x 1 def setx(self, v): self.x v a A() a.setx(2) print(a.x) # 输出为2因为绑定了self实例__dict__类和对象的属性通过字典进行存放class C: pass c C() c.x 1 c.y 2 c.z 3 c.t hello print(c.__dict__) # 输出为{x: 1, y: 2, z: 3, t: hello}__slots__避免利用字典存放造成空间上的浪费但失去了动态添加属性的功能class C: __slots__ [x, y] # 仅允许x、y属性 def __init__(self, x, y): self.x x self.y y c C(1, 2) print(c.x, c.y) print(c.__slots__) # print(c.__dict__) 报错不在以字典存放属性 # c.z 3 报错不能动态添加属性 class E(D): pass e E(1, 2) e.z 3 print(e.__slots__) print(e.__dict__) # 子类没有定义__slots__所以可以动态添加属性super()class A: def __init__(self): print(Initializing A) class B(A): def __init__(self): A.__init__(self) print(Initializing B) class C(B): def __init__(self): A.__init__(self) print(Initializing C) class T(C, B): def __init__(self): C.__init__(self) B.__init__(self) print(Initializing T) t T()输出为Initializing AInitializing CInitializing AInitializing BInitializing T采用super函数查找父类方法可避免重复调用class A: def __init__(self): print(Initializing A) class B(A): def __init__(self): super().__init__() print(Initializing B) class C(B): def __init__(self): super().__init__() print(Initializing C) class T(C, B): def __init__(self): super().__init__() print(Initializing T) t T()输出为Initializing AInitializing BInitializing CInitializing T私有变量__开头以__开头的属性 / 方法Python 会自动重命名_类名__属性名无法直接访问python无法将变量真正私有化但是可以通过名字修饰伪私有化即在名称前加两个下划线方法同理class C: __x 0 # 私有类属性 def __init__(self, x): self.__x x def get_x(self): # 提供接口访问私有属性 return self.__x def set_x(self, x): self.__x x c C(1) # c.__x 报错 print(c.get_x()) # 正常 print(c._C__x) # 正常强制访问访问私有变量的另一种方式 c.__y 2 print(c.__y) # 正常新增了一个公有变量,名字改编发生在类实例化对象时单下划线开头的变量是仅供内部使用的变量不可随意修改但python不会阻止用户修改单下划线结尾的变量用于想把关键字作为变量时如class_虽然__init__()是对象构建的时候调用的方法参与构建对象还有一个__new__()方法在__init__()调用之前被调用实际对象是由__new__()方法创建的self也是由new返回的模块和包四种导入模块方式import 模块名 #之后使用模块内的函数或变量时使用模块名.函数名/变量名import 模块名 as 新的模块名 #之后使用模块内的函数或变量时使用新的模块名.函数名/变量名from 模块名 import 要使用的函数/变量 #多个函数/变量可,分割from 模块名 import * #导入模块所有内容不推荐使用导入多个模块时可能引起命名冲突名称冲突时较迟导入模块中的方法会覆盖较早导入模块中的# 方式1导入整个模块 import math print(math.pi) # 3.141592653589793 # 方式2导入模块并改名 import math as m print(m.pi) # 方式3导入模块指定内容 from math import pi, sqrt print(sqrt(4)) # 2.0 # 方式4导入模块所有内容不推荐易命名冲突 from math import *name main模块在导入后会从头执行模块中的所有内容包括测试语句所有在导入模块的文件中会输出额外的测试语句避免额外输出在模块测试语句前增加 if __name__ __main__ 当if __name__ __main__时才会执行测试语句一个模块作为脚本独立执行时其__name__属性就会被赋值为__main__作为模块导入时name的值就是模块的名称而非__main__所以当模块作为包导入文件时该if条件为false# test.py def add(a, b): return a b if __name__ __main__: # 仅模块独立运行时执行测试代码 print(add(3, 5)) # 8__all__指定的变量和函数可以使用from ... import *语法导入对于模块若未定义__all__属性则from ... import *可导入模块内所有东西对于包若未定义__all__属性则from ... import *不可导入包中任何模块内的东西__all__ [f, b] #表示仅函数f和变量b可使用import *导入其他的文件即仅导入f和b a 5 def f(): print(hello) b 1将程序托管到pypi上登录pypi官网注册账号按指定框架部署代码项目名字不可与pypi上已有的重复
Python入门
目录python两种模式数据类型基本数据类型列表字典(dict)元组tuple集合逻辑运算符常用语句type()print()基础输出函数注释input其他常用内置函数流程控制if语句for语句while语句函数lambda匿名函数装饰器生成器类型注释文件对象异常类组合__dict__类和对象的属性通过字典进行存放__slots__避免利用字典存放造成空间上的浪费但失去了动态添加属性的功能super()私有变量__开头模块和包四种导入模块方式name main__all__指定的变量和函数可以使用from ... import *语法导入将程序托管到pypi上python两种模式命令行模式将代码写入.py后缀的文件如test.py通过 Python 解释器一次性执行整个文件运行时python解释器会一行一行解析执行交互模式控制台模式输入一行后python立刻执行并返回结果点击PyCharm下方python控制台即可进入或Windows系统中进入cmd命令行输入python3数据类型Python 无需手动声明变量类型解释器会自动识别基本数据类型类型说明示例整数int正负整数、0a 10、b -5、c 0浮点数float带小数点的数x 3.14、y -0.5字符串str文本数据引号包裹name Lili、msg Hi布尔值bool逻辑判断True/Falseis_ok True、is_error FalseNone 类型空值无意义占位result None函数无返回值时默认返回列表用[]定义元素可增删改查支持任意数据类型max(list1) #列表最大值min(list1) #列表最小值sorted(list1) #排序list1.append(1) #新增元素 list1.extend([1,2]) #添加多个元素list1.remove(1) #移除元素 list1.clear() #清除列表中的所有元素len(list1) #返回列表元素的数量# 定义列表 list1 [1, 3, 5, 2, 4] list2 [苹果, 香蕉, 100, True] # 混合类型 # 核心操作 print(list1[0]) # 索引取值1第一个元素 print(list1[1:3]) # 切片[3,5]第2-3个元素 list1.append(6) # 末尾新增元素[1,3,5,2,4,6] list1.remove(3) # 移除指定元素[1,5,2,4,6] list1.sort() # 排序默认升序[1,2,4,5,6] print(max(list1)) # 最大值6 print(min(list1)) # 最小值1 print(len(list1)) # 元素个数51.1创建空列表# 方式1推荐简洁高效 empty_list [] # 方式2用list()函数适合动态生成列表时 empty_list2 list()初始化固定长度的列表counts [0] * 26 # 输出[0,0,...,0]共26个0 [1,2] * 3 # 输出[1,2,1,2,1,2]字典(dict)核心储存键值对类型不可变 用{key: value}定义通过键key查找值valuekey 不可重复且必须是不可变类型如 str、int、tuplecontact {“lili”:123456789, qiqi:234567891} contact[qiqi] #获取键值 contact[w] 123 #新增键 len(contact) #查看键值对数量 del contacts[qiqi] #删除键值对 print(qiqi in contacts) #查询键值是否存在返回bool类型值1.1空字典的创建# 方式1推荐简洁高效 empty_dict {} # 方式2用dict()函数适合动态生成字典时 empty_dict2 dict()1.2默认字典mp collections.defaultdict(list) #Python 内置的默认字典属于collections模块是普通字典dict的增强版解决了 “普通字典访问不存在的 key 会报错” 的问题。指定value的默认类型为list访问不存在的key时自动创建空列表1.3字典对象的转换edict() 将字典转为可通过.访问的对象原生字典只能通过[ ] 访问用.访问报错dict() : 将 edict 对象转回普通字典补充可以用.访问的对象数据类型能否用.访问原因示例原生字典dict不能Python 语法规定字典是键值结构只能用[]访问键d {a:1}; d[a]✅ /d.a❌列表list不能列表是索引结构只能用[]访问索引lst [1,2]; lst[0]✅ /lst.0❌元组tuple不能同列表只能用[]访问索引t (1,2); t[0]✅ /t.0❌自定义类 / 对象可以类的属性 / 方法都通过.访问class A: a1; objA(); obj.a✅edict 对象可以第三方库封装把字典键转为对象属性ed edict({a:1}); ed.a✅argparse 参数对象可以Python 内置参数解析后返回的对象支持属性访问args.input_dir✅元组tuple不可变有序序列无法执行删除、添加等操作适用于固定数据# 定义元组小括号可省略但推荐保留 t1 (1, 2, 3) t2 (键盘, 鼠标, 99.9) t3 (1,) # 单元素元组必须加逗号否则会被识别为普通变量 # 核心操作仅查无增删改 print(t1[0]) # 索引取值1 print(t1[1:3]) # 切片(2,3) print(len(t1)) # 元素个数3 print(max(t1)) # 最大值3集合可变无序不重复集合用{}定义空集合需用set()而非{}常用于去重、交集 / 并集运算s1 {1, 2, 3, 3, 4} # 自动去重{1,2,3,4} s2 set([2, 4, 5, 6]) # 从列表转集合{2,4,5,6} # 核心操作 s1.add(5) # 新增元素{1,2,3,4,5} s1.remove(3) # 删除元素{1,2,4,5} print(s1 s2) # 交集{2,4,5} print(s1 | s2) # 并集{1,2,4,5,6} print(s1 - s2) # 差集{1}逻辑运算符用于连接多个条件遵循「短路原则」and遇到false停or遇true停运算符说明短路规则示例and逻辑与同时成立遇 False 立即返回3 and 4 →返回 4、0 and 3 → 返回0or逻辑或至少一个成立遇 True 立即返回3 or 4 → 返回3、0 or 3 →返回 3not逻辑非取反True ↔ Falsenot True → False常用语句type()返回数据类型a 10 c [1,2,3] print(type(a)) # class int print(type(c)) # class listprint()基础输出函数print( );打印“”间的内容单引号也可 print( )print()可以用拼接print(hello\lili\ )字符中有\解释器会读入\及其后字符最终输出hellolilipython读一行执行一行所以不能随意换行换行可以\n# \n换行符 print(Hello\nLili) # 输出两行Hello 和 Lili # \输出双引号避免与字符串边界冲突 print(Hello \Lili\) # 输出Hello Lili原教程解释错误修正此处 # \t制表符类似键盘 Tab 键 print(姓名\t年龄) # 输出姓名 年龄多参数输出print(姓名, name, 年龄, 20) # 输出姓名 Lili 年龄 20逗号自动加空格 print(1, 2, 3, sep---) # sep 指定分隔符输出1---2---3打印多跨行内容使用三引号print(你好 lili 好久不见了 或print(你好\n\ lili \n\ 好久不见了 \n 注释单行注释#多行快捷注释PyCharm专用选中多行内容ctrl/三引号多行注释“““input返回用户输入内容返回类型为string需手动转换为其他类型current input(用户输入内容)其他常用内置函数函数说明示例len(obj)返回对象长度元素个数len([1,2,3]) → 3、len(abc) → 3enumerate()遍历带索引for i, v in enumerate([1,2]): print(i, v)zip()多序列打包for a,bc in zip([1,2], [3,4],[3,4]): print(a,b,c)range()生成整数序列左闭右开range(1,5) → 1,2,3,4、range(5) → 0,1,2,3,4字典.values()获取字典所有 valuemp {aet:[eat,tea], ant:[tan]}mp.values()→dict_values([[eat,tea], [tan]])list(可迭代对象)转成列表list(mp) [[eat,tea], [tan]].join(列表)列表拼接成字符串作用是 “用指定分隔符这里是空字符串拼接列表中的所有元素”.join([a,e,t]) # 输出aet -.join([a,e,t]) # 输出a-e-t分隔符为-ord(字符)获取字符的 Unicode 编码ord(e) - ord(a) 4流程控制if语句# 基础结构if-else age 16 if age 18: print(未成年) # 缩进4个空格条件成立时执行 else: print(成年) # 条件不成立时执行 # 多条件判断if-elif-else score 85 if score 90: print(优秀) elif score 80: print(良好) # 输出良好 elif score 60: print(及格) else: print(不及格) # 三元表达式简化 if-else print(未成年) if age 18 else print(成年) # 输出未成年for语句使用for循环进行迭代迭代对象可以是列表字典字符串等for 变量名 in 迭代对象#执行语句# 1. 遍历字符串 for char in FISHC: print(char) # 逐个输出F、I、S、H、C # 2. 遍历列表 fruits [苹果, 香蕉, 橙子] for fruit in fruits: print(f水果{fruit}) # 3. range() 函数生成整数序列 # range(开始, 结束, 步长) → 左闭右开 for i in range(1, 10, 2): print(i) # 输出1、3、5、7、9 # 4. 遍历字典结合 items() contact {Lili: 123, Qiqi: 456} for key, value in contact.items(): print(f{key}{value})while语句满足条件时重复执行代码块# 基础示例计数器循环1~5 i 1 while i 5: print(i) # 输出1、2、3、4、5 i 1 # 计数器自增避免死循环 # 死循环需避免除非有退出条件 # while True: # print(无限循环) # break # break 强制退出循环函数1.函数是封装的可复用代码块通过def定义def 函数名():函数体def myfunc(name): print(fI love {name}.)#在字符串前面加上f可通过{}引用变量2.关键字参数位置参数按位置顺序传递1关键字参数按名称传递def myfunc(name, age): print(f姓名{name}年龄{age}) myfunc(nameQiqi, age20) # 输出姓名Qiqi年龄20 myfunc(age20, nameQiqi) # 顺序可乱2位置参数按位置顺序传递def myfunc(name, age): print(f姓名{name}年龄{age}) myfunc(Lili, 18) # 按顺序传递输出姓名Lili年龄18 # myfunc(18, Lili) # 错误类型不匹配3混合使用时位置参数必须在关键字参数之前否则python报错def myfunc(name, age): print(f姓名{name}年龄{age}) myfunc(Wang, age22) # 正确位置参数在前 # myfunc(nameWang, 22) # 错误关键字参数不能在位置参数前def abs(a,/,b,c): #/左侧不支持关键字参数 print(a,b,c) def abs(a,*,b,c): #*右侧只能是关键字参数,相当于匿名的收集参数 print(a,b,c)3.收集参数 形参前* 或***接收任意数量的位置参数以元组形式存储**接收任意数量的关键字参数以字典形式存储def func(*args): #*元组形式的收集参数 print(args) def func(**kwargs): #**字典形式的收集参数 print(kwargs) def func(a,*b,**c): print(a,b,c) func(1,2,3,4,x5,y6) #输出1 (2, 3, 4) {x: 5, y: 6}4.解包参数实参前*将元组解包为位置参数**将字典解包为关键字参数def f2(a,b,c,d): print(a,b,c,d) a (1,2) b {c:5,d:6} f2(*a,**b) #解包参数lambda匿名函数lambda是表达式而非语句可出现在python语法中不允许def语句出现的地方.y [lambda x: x*x,2,3] y[0](y[1]) #将y[1]作为实参传递给匿名函数lambda装饰器装饰器是「接收函数、返回函数」的高阶函数利用闭包保留原函数引用。在不修改原函数代码、不改变函数调用方式的前提下给函数增加额外功能#给一个计算求和的函数新增 “统计执行耗时” 的功能不修改原函数代码 import time # 1. 定义原函数业务逻辑计算1到n的和 def sum_num(n): time.sleep(0.5) # 模拟函数执行耗时 total 0 for i in range(n1): total i return total # 2. 定义装饰器函数核心接收原函数返回新函数 def time_decorator(func): # 闭包wrapper是新函数能访问外部的func def wrapper(*args, **kwargs): # 新增功能1记录开始时间 start time.time() # 执行原函数保留原逻辑 result func(*args, **kwargs) # 新增功能2记录结束时间计算耗时 end time.time() print(f函数 {func.__name__} 执行耗时{end - start:.2f} 秒) # 返回原函数的结果保证原函数调用结果不变 return result # 返回新函数替代原函数 return wrapper # 3. 手动给原函数“贴装饰器” sum_num time_decorator(sum_num) # 4. 调用函数调用方式和原函数完全一样 result sum_num(100000) print(f求和结果{result})用 语法糖简化import time # 1. 定义装饰器 def time_decorator(func): def wrapper(*args, **kwargs): start time.time() result func(*args, **kwargs) end time.time() print(f函数 {func.__name__} 执行耗时{end - start:.2f} 秒) return result return wrapper # 2. 用语法糖给函数贴装饰器 time_decorator # 等价于sum_num time_decorator(sum_num) def sum_num(n): time.sleep(0.5) total 0 for i in range(n1): total i return total # 3. 调用方式不变 result sum_num(100000) print(f求和结果{result})其他例子# 定义装饰器 def log_decorator(func): def wrapper(*args, **kwargs): print(f调用函数{func.__name__}) result func(*args, **kwargs) print(f函数执行完成结果{result}) return result return wrapper # 使用装饰器 log_decorator def add(a, b): return a b add(3, 5) # 输出 # 调用函数add # 函数执行完成结果8装饰器形式def 装饰器名(原函数): def 包装函数(*args, **kwargs): # 新增功能前 结果 原函数(*args, **kwargs) # 新增功能后 return 结果 return 包装函数 装饰器名 def 原函数(): 原逻辑生成器按需生成值不提前占用内存每调用一次提供一个数据并且会记住当前状态而列表元组这些可迭代对象则是容器存放所有已经准备好的所有数据def counter(): i 0 while i 5: yield i i 1可通过next()函数获取生成器的下一个值c counter() print(next(c))for循环遍历生成器的值for i in counter(): print(i) #每次执行到yield i时就生成一个数据暂停并保留状态下一次调用从下一个语句 #i1开始继续执行生成器表达式x ** 2 for x in range(5)它生成一个迭代器按需计算并产生值只有在调用next(c)或遍历生成器时才逐个计算并返回结果类型注释def times(s:str,n:int) - str: #传入参数s是字符串类型,n是整型返回值为字符串类型 return s*n文件对象文件读写f open(data.txt,w) f.write(hello,world) #操作 f.close #等价 with open(data.txt,w) as f: f.write(hello,world)pickle 将python对象序列化转为二进制import pickle x,y,z1,2,3 with open(data.pkl, wb) as f: pickle.dump((x,y,z), f) # 存储数据 with open(data.pkl, rb) as f: x, y, z pickle.load(f) # 读取数据 print(x, y, z,sep---)异常try: #检测范围内的代码块 except #异常处理代码 else #未触发异常时异常处理代码 finally #最终执行raise语句和assert语句主动引发异常assert语句仅可引发一个叫做AssertionError的异常# 1. raise自定义异常 age -1 if age 0: raise ValueError(年龄不能为负数) # 2. assert断言条件不成立时抛AssertionError s hello assert s hello #条件成立无事发生不成立引发异常assertionError类类里面的方法需要一个self参数作为第一个参数 self是实例化对象本身class A(C):继承类Cinstance(b,B):判断对象是否属于某个类 instance(b,B)class C : def hello(self): print(Hello, World!) c C() c.hello() class A(C): def greet(self): print(Greetings from class A!) a A() a.hello() a.greet() isinstance(a, C) # This will return True组合class C : def hello(self): print(C Says Hello!) class B: def hello(self): print(Greetings from class B!) class A: def hello(self): print(Greetings from class A!) class Temp(): a A() b B() c C() def say(self): self.a.hello() self.b.hello() self.c.hello() t Temp() t.say()必须有selfclass C : x 1 def setx(self, v): x v c C() c.setx(2) print(c.x) # 输出为1因为没有绑定self实例 C.x2 # 绑定类属性 print(c.x) # 输出为2因为类属性被修改了 print(c.__dict__) # 输出为{}对象中没有但是生成它的类中有 print(C.__dict__) class A : x 1 def setx(self, v): self.x v a A() a.setx(2) print(a.x) # 输出为2因为绑定了self实例__dict__类和对象的属性通过字典进行存放class C: pass c C() c.x 1 c.y 2 c.z 3 c.t hello print(c.__dict__) # 输出为{x: 1, y: 2, z: 3, t: hello}__slots__避免利用字典存放造成空间上的浪费但失去了动态添加属性的功能class C: __slots__ [x, y] # 仅允许x、y属性 def __init__(self, x, y): self.x x self.y y c C(1, 2) print(c.x, c.y) print(c.__slots__) # print(c.__dict__) 报错不在以字典存放属性 # c.z 3 报错不能动态添加属性 class E(D): pass e E(1, 2) e.z 3 print(e.__slots__) print(e.__dict__) # 子类没有定义__slots__所以可以动态添加属性super()class A: def __init__(self): print(Initializing A) class B(A): def __init__(self): A.__init__(self) print(Initializing B) class C(B): def __init__(self): A.__init__(self) print(Initializing C) class T(C, B): def __init__(self): C.__init__(self) B.__init__(self) print(Initializing T) t T()输出为Initializing AInitializing CInitializing AInitializing BInitializing T采用super函数查找父类方法可避免重复调用class A: def __init__(self): print(Initializing A) class B(A): def __init__(self): super().__init__() print(Initializing B) class C(B): def __init__(self): super().__init__() print(Initializing C) class T(C, B): def __init__(self): super().__init__() print(Initializing T) t T()输出为Initializing AInitializing BInitializing CInitializing T私有变量__开头以__开头的属性 / 方法Python 会自动重命名_类名__属性名无法直接访问python无法将变量真正私有化但是可以通过名字修饰伪私有化即在名称前加两个下划线方法同理class C: __x 0 # 私有类属性 def __init__(self, x): self.__x x def get_x(self): # 提供接口访问私有属性 return self.__x def set_x(self, x): self.__x x c C(1) # c.__x 报错 print(c.get_x()) # 正常 print(c._C__x) # 正常强制访问访问私有变量的另一种方式 c.__y 2 print(c.__y) # 正常新增了一个公有变量,名字改编发生在类实例化对象时单下划线开头的变量是仅供内部使用的变量不可随意修改但python不会阻止用户修改单下划线结尾的变量用于想把关键字作为变量时如class_虽然__init__()是对象构建的时候调用的方法参与构建对象还有一个__new__()方法在__init__()调用之前被调用实际对象是由__new__()方法创建的self也是由new返回的模块和包四种导入模块方式import 模块名 #之后使用模块内的函数或变量时使用模块名.函数名/变量名import 模块名 as 新的模块名 #之后使用模块内的函数或变量时使用新的模块名.函数名/变量名from 模块名 import 要使用的函数/变量 #多个函数/变量可,分割from 模块名 import * #导入模块所有内容不推荐使用导入多个模块时可能引起命名冲突名称冲突时较迟导入模块中的方法会覆盖较早导入模块中的# 方式1导入整个模块 import math print(math.pi) # 3.141592653589793 # 方式2导入模块并改名 import math as m print(m.pi) # 方式3导入模块指定内容 from math import pi, sqrt print(sqrt(4)) # 2.0 # 方式4导入模块所有内容不推荐易命名冲突 from math import *name main模块在导入后会从头执行模块中的所有内容包括测试语句所有在导入模块的文件中会输出额外的测试语句避免额外输出在模块测试语句前增加 if __name__ __main__ 当if __name__ __main__时才会执行测试语句一个模块作为脚本独立执行时其__name__属性就会被赋值为__main__作为模块导入时name的值就是模块的名称而非__main__所以当模块作为包导入文件时该if条件为false# test.py def add(a, b): return a b if __name__ __main__: # 仅模块独立运行时执行测试代码 print(add(3, 5)) # 8__all__指定的变量和函数可以使用from ... import *语法导入对于模块若未定义__all__属性则from ... import *可导入模块内所有东西对于包若未定义__all__属性则from ... import *不可导入包中任何模块内的东西__all__ [f, b] #表示仅函数f和变量b可使用import *导入其他的文件即仅导入f和b a 5 def f(): print(hello) b 1将程序托管到pypi上登录pypi官网注册账号按指定框架部署代码项目名字不可与pypi上已有的重复