Index. 内容
基本部分笔记记录在这里其他内容参考:
开始、python开发环境配置以及IDE配置
在开始写python项目钱,我们必须先安装python的环境、虚拟环境以及IDE。IDE的配置后面有专门的笔记记录下,这部分内容也可以单独开设一个专题。
python的安装
python的IDE配置
python的环境变量配置
虚拟环境
python3 -m venv venv
source ./venv/bin/activate
deactivate
pip 安装和 源设置
一、基础部分
- 学习世界: 2022-10-21
1.1 变量
Python变量的命名规范:
- 必须是数字或字母或下换线组成.
- 不能是数字开头,更不能是纯数字
- 不能用python的关键字
- 不要用中文
- 不要太长
1.2 常量
变量的形式:
- print(123)
- 字母大写的变量 可以 认为是常量。
- python里没有绝对意义的常量,都可以被覆盖
1.3 数据类型
- 数字
- 文字
- 布尔: True 、 False
1.4 控制语句
判断语句
语句结构:
if 1:
pass
elif 2:
pass
else:
pass
循环语句
语句结构:
while True:
pass
i = 1
while i <= 100:
print(1)
i = i + 1
- break:让当前这个循环立即停止,用在while语句中
Q: for 循环中可以用吗?
- continue:停止当前本次循环,继续执行下一次循环
- pass : 代码占位,无作用
for循环
- 字符串可以迭代
s = 'hello'
for c in s:
print(c)
for i in range(3,10):
print(1)
range (n)
: 从0数到n.不包含nrange (m, n)
:从m数到n,不包含nrange(m, n,s)
:从m数到n,不包含n, 每次的间隔是s
1.5 python的基础类型
- ini, float, bool
- str
- list
- tuple
- set
- dist
- bytes
- 运算符
- 文件操作
1.5.1 数字
1.5.2 字符串 str
- %s 字符串占位
- %d 整数占位
字符串格式化
s = "我叫%S" % name
s0 = "我叫%S,我住在%S,我今年%d岁,我喜欢%s" % (name, address, age, hobby)
s1 = "我叫{},我住在{},我今年{}岁,我喜欢{}".format (name, address, age, hobby)
s2 = f"我叫{name},我叫{name},今年{age}岁,我叫{name},我叫{name}" # f-string
print (s1)
索引和切片
# 索引:
s = "我叫周杰伦"
print(s[0])
print(s[-1])
# slice: 从一个字符串中提取一部分内容
print(s[3:6]) # 从索引3的位置进行切片,切到6结束,但取不到索引6
print(s[-3:-1])
# 可以给切片添加步长拉及控制方向
print(s[::-1]) # 表示从右往左
字符串的常规操作
- s.capitalize() : 字符串大小写转换
- s.title() : 单词的首字母大写
- s.lower() : 所有字母换小写
- s.upper() : 所有字母换大写
字符串的切割和替换
- s.strip(): 去掉字符串左右两端的空白符(空格、\t 、 \n)
- s.replace(old, new) # 替换
- s.split(切割符号) # 按切割的字符串切割,会返回切割后的列表
字符串的查找和替换
s = "你好,我叫周润发"
r = s.find("周润发") # 返回结果-1是没有, 如果有则返回整数索引
r = r.index("zhou") # 如果报错就没有
print("周" in s) #
print("周" not in s) #
s.startwith('涨') # 判断字符串是否以xxx开头
s.isdigit() # 判断字符串是否由整数组成
补充和总结
- len(): length长度
- “xx”.join(): 用xx拼接list为字符串
1.5.3 列表
a = [‘aaa’,‘bbb’,‘ccc’] 列表特征:
- 也像字符串一样也有索引和切片
- 索引如果超过范围会报错
- 可以用for循环进行遍历
- 用len可以拿到列表的长度
l = []
l.append(111) # 追加
l.insert(222) # 插入
l.extend(['aaa','bbb']) # 合并2个列表
l.pop(3) # 弹出指定索引的元素
l.remove('aaa') # 删除某个元素
l[4] = 'oo' # 直接用索引修改元素
print(l[4]) # 查询某个元素
# 列表的排序
l = [1,2,3,'aa','bb']
l.sort() # 对列表进行升序排序
l.sort(reverse = True) # reverse: 翻转
for i in l: # 遍历列表
pass
1.5.4 元组
tuple元组: 固定了某些数据,不允许外界修改,内存地址不能变
t = ('aaa','bbb', [1,2,3])
t[0] = 'ooo' # 报错,不可被重新赋值
t[2].append(4) # 坑: 元组里面元素的内容如果是列表的话可以变
1.5.5 set集合
- set集合是无序的
- 没有重复的数据出现,重要的作用是去重复数据
s = {1,2, 'aaa',3} # 打印后位置会变
s = {1,2, 'aaa',3, []} # 报错,有不可哈希的元素
- 不可哈希:python中的set集合进行数据存储的时候,需要对数据进行哈希计算,根据计算出来的哈希值进行存储数据 set集合要求存储的数据必须是可以进行哈希计算的. 可变的数据类型,list, dict, set
- 可哈希:不可变的数据类型,int,str, tuple, bool.
s = set() # 创建空集合
s.add('ccc')
s.add('ddd')
s.pop() # 由于集合无序,测试的时候无法验证是最后一个
s.remove('ccc') #先要修改,先删除再新增
交集、并集、差集
s1= {'aaa',"皮长山"}
s2 = {"刘科长","冯乡长","皮长山"}
print (s1 & s2) #交集
print(s1. intersection(s2))
print (s1 | s2) #并集
print(s1.union(s2))
print (s1 - s2) #差集
print (s1.difference(s2))
1.5.6 字典
- 字典是以键值对的形式进行存储数据的
- 表示方式: {key: value, key2: value2}
- key必须是可哈希的数据类型, value可以放任何数据类型
dic = {'jay': "周杰伦" , }
print(dic['jay'])
# 字典的增删改查
dic = dict()
dic['jay'] = "周杰伦"
dic[1] = 123
dic['jay'] = "kkk" # 修改操作
dic.setdefault('tom', 'aaa') # 设置默认值,如果以前已经有了tom,setdefault就不起作用了
dic.setdefault('tom', 'bbb') # 设置默认值,如果以前已经有了tom,setdefault就不起作用了
dic.pop('jay') # 根据key删除指定值
print(dic['xx']) # 如果key不存在,程序会报错
print(dic.get('xx')) # 如果key不存在,程序返回None
# None 空类型
n = None
print(type(n))
if d.get('aaa') == None: print('不存在这个人')
# 循环
for k, v in dic.items():
print(item)
print(k, v)
# 嵌套
# 关于字典的循环删除, 不能修改原来的,可以用新字典接
temp=[]
for key in dic:
if key.startswich('大');
# dic.pop(key) # 报错,不能修改循环中的字典
temp.append(key)
1.5.7 bytes
-
字符和编码
- 二进制: 0 1 <==> 10101010 =》 二进制转换成十进制 《==》
- ascii =》 编排了128个文字符号,只需要7位二进制 0111111 =》 1 byte =》 8bit
- ANSI =》 一套标准,每个字符16bit,2byte
- Unicode: 万国码, 32bit、4byte (没法用,是一种标准)
- utf: 是可变长度的unicode,可以进行数据的传输和存储 utf-8:最短的字节长度8 英文 8bit 1, 欧洲文字 16bit 2byte, 中文:24bit,3byte utf-16:最短的字节长度16
- gbk和utf-8 不能直接进行转化。
-
bytes
-
str.encode(“编码”): 进行编码
-
bytes.decode(“编码”): 进行解码
s = "周杰伦"
bs1 = s.encode("gbk") # b'xxxx" bytes类型
bs2 = s.encode("utf-8")
print(bs1)
# 怎么把一个gbk的字节转化成utf-8的字节
bs = b'\xd6\xdc\xbd\xdc\xc2\xd7"
# 先变成文字符号(字符串)
s= bs.decode ("gbk") #解码
bs2 三 s.encode ("utf-8") # 重新编码
print (bs2)
1.5.8 运算符
-
算数运算 : +-*/%
-
比较运算 : > < >= <= == !=
-
赋值运算: = += -= *= a += b 等同于 a = a + b
-
逻辑运算: and or not 运算的时候 最好加上括号 以免歧义 优先级: 先算括号内的 > not > and > or
print(True and False or True or not False)
- 成员运算: in、 not in
1.5.9 文件操作
mode 模式:
- r: 读取模式
- w: 写入模式
- a: 追加模式
- b: 读写非文本文件 -》 bytes
with: 上下文, 不需要手动去关闭一个文件
修改文件:
- 从源文件中读取内容.
- 在內存中进行调整(修改)
- 把修改后的内容写入新文件中
- 删除源文件.将新文件重命名成源文件
f = open(“文件路径", mode=“模式", encoding=“编码格式")
line = f.readline() # 读一行往下走一行
line = f.readline().strip() # 去掉两边空白和换行符
content = f.readlines()
print(content)
for line in f:
print(line.strip())
# 写入文件
f = open('test.txt', mode='w', encoding='utf-8')
f.write('aaa')
f.close()
# 准备一个列表.要求把列表中的每一项内容,写入到文件中
lst =【"张无忌","汪峰","章子怡","赵敏"]
f = open("打架.txt", mode="w", encoding="utf-8")
for item in lst:
f.write(item)
f.write("\n")
f.close()
with open("国产自拍.txt", mode="w", encoding="utf-8"):
for line in f:
print(line.strip())
f.read() # 报错,with完成后会自动关闭文件
# 读取非文本文件时候要加上b
with open("美女.jpeg", mode="rb"):
for line in f:
print(line)
# 文件复制
with open("美女.jpeg", mode="rb") as f1, \
open("美女2.jpeg", mode="wb") as f2:
for line in f1:
f2.write(line)
1.6 函数编程
函数的概念 函数的参数 函数的返回值 python內置函数
1.6.1 函数的定义
函数:对某一个特定的功能或者代码块进行封装.在需要使用该功能的时候直接调用即可
定义: def 函数的名字(): 被封装的功能或者代码块->函数体
调用: 函数的名字()
好处:证程序更加简洁.代码更加合理
参数:可以在函数调用的时候.给函数传递一些信息 分类: 1. 形参,在函数定义的时候.需要准备一些变量来接收信息 1. 位置参数,按照位置一个一个的去声明变量 2. 默认值参数,在函数声明的时候给变量一个默认值,如果实参不传递信息,此时默认值生效,否则就不生效 3. 动态传参。 1. *args, 表示接收所有的位置参数的动态传参 2. **kwargs,表示接收所有的关键字的动态传参 顺序:位置> *args 》 默认值 > **kwargs 上述参数可以随意搭配使用
2.实参,实际在调用的时候传递的信息
1. 位置参数.按照位置进行传递参数
2. 关键字参数.按照参数的名字进行传递参数
3. 混合参数.
顺序:位置参数放前面,关键字参数放后面 -》 否则报错!官方不让这么干
实参在执行的时候,必须要保障形参有数据
返回值:函数执行之后.会给调用方一个结果.这个结果就是返回值
关于return:
函数只要执行到了 return.函数就会立即停止并返回内容.函数内的return的后续的代码不会执行
1. 如果函数内没有 return,此时外界收到的是None
2.如果写了 return
1.只写了return,后面不跟数据,此时接收到的依然是None -》相当于break
2. return 值,此时表示函数有一个返回值,外界能够收到一个数据 -> 用的最多
3. return 值1,值2,值3... 此时函数有多个返回值,外界收到的是元组,并且,该元组内存放所有的返回值,
def fun_name(para=True):
pass
fun_name(False)
def chi(*food): # * 表示位置参数的动态传参, *接受到的值会统一放在一个元组里面
print(food)
def func(a, b, c="哈哈",*ags,**kwargs):
print(a, b, args, kwargs)
func(1,2,3,4,5,6,7,8,9, helLo=456, hahalou =654)
# > 1 2 3 (4, 5,6,7,8, 9) {'hello':456,'hahalou':654}
lst = [1,2,3,4]
def func(*args):
print(args)
func(*lst) # *在实参位置,是把列表打散称位置仓数进行传递
1.6.2 内置函数
内置函数: 直接能拿来用的函数
int bool float complex 复数: 实部 + 虚部
-
sum
-
min
-
max
-
pow
-
slice()
1.6.3 函数的嵌套
函数的嵌套 变量的作用域 闭包 装饰器 迭代器 生成器 推导式 匿名函数 python內置函数_下
1.6.4 作用域
作用域: 变量的访问权限
global: 在局部,引入全局 nonlocal: 在局部,引入外层的局部变量
a = 10
def func():
# print (a)
# 此时我就想在函数内部修改全局的变量a
global a # 把外面的全局变量引入到局部
a = 20 # 创建一个局部变量,并没有去改变全局变量中的a
1.6.5 闭包
闭包:本质,内层函数对外层函数的局部变量的使用,此时内层函数被称为闭包函数 1. 可以让一个变量常驻与内存 2. 可以避免全局变量被修改
def func():
a = 10
def inner():
nonlocal a # 向外找一层.看看有没有该变量,如果有就引入,如果没有,继续向外一层,直到全局(不包括)
a += 1
return a
return inner
ret = func()
# inner => ret => 什么时候执行
ret()
1.6.6 函数装饰器
内容回顾:
- 函数可以做为参数进行传递
- 函数可以作为返回值进行返回
- 函数名称可以当成变量一样进行赋值操作
装饰器: -》 要求记住最后的结论 装饰器本质上是一个闭包 作用: 在不改变原有函数调用的情况下,给函数增加新的功能 直白: 可以在函数前后添加新功能,但是不改原来的代码 在用户登录的地方,日志, 通用装饰器的写法: def wrapper(fn): wrapper: 装饰器, fn:目标函数 def inner(*args, **kwargs): # 在目标函数执行之前 ret = fn(*args, **kwargs) # 在目标函数执行之后 return ret return inner @wrapper1 @wrapper2 def targe(): pass target() # => inner()
def func1():
print("我是函数1")
def func2():
print(“我是函数2")
func1 = func2
func1() # 输出 ““我是函数2"
### 装饰器原理
def guanjia(game):
def inner():
print("打开外挂")
game () 玩起来了
print('关闭外挂")
return inner
def play_dnf():
print("你好啊,我叫赛利亚,今天又是美好的一天!)
def play_lol():
print("德玛西亚!!!!!!")
play_dnf = guanjia(play_dnf) # 让管家把游戏重新封装一遍,我这边把原来的游戏替换了
play_dnf() # d此时运行的是guanjia给的内层函数inner
### 装饰器优化
@guanjua # 相当于 play_dnf = guanjia(play_dnf)
def play_dnf():
print("你好啊,我叫赛利亚,今天又是美好的一天!)
装饰器实战
1.6.7 迭代器
iterable: 可迭代的东西, python中可以迭代的数据类型有: str,list、tuple、dict、set、open()
可迭代的数据类型都会提供一个叫迭代器的东西,这个迭代器可以帮我们把数据类型中的所有数据逐一的拿到
获取迭代器的两种方案:
1. iter()内置函数可以直接拿到迭代器
2. __iter__
从迭代器中拿到数据:
1. next() 内置函数 ,迭代超过后,如果还执行next镜像迭代就报:StopIteration
2. __next__()
特殊方法
for里面一定是要拿迭代器的,所以所有不可迭代的东西不能用for循环
for循环里面一定有__next__
出现
迭代器本身的特性:
- 只能向前不能反复
- 特别节省内存
- 惰性机制
1.6.8 生成器
生成器(generator): 生成器的本质就是迭代器
创建生成器的两种方案:
1. 生成器函数
2.生成器表达式
生成器函数
生成器函数中有一个关键字yield
生成器函数执行的时候,并不会执行函数,得到的是生成器. 〉
yield:只要函数中出现了yield.它就是一个生成器函数
作用:
1. 可以返回数据
2. 可以分段的执行函数中的内容,通过`__next__()`可以执行到下一个yield位置
优势:
用好了,特别的节省内存
推导式
推导式: 简化代码, 语法: 列表推导式:[数据 for循环 if判断] 集合推导式: {数据 for循环 if判断} 字典推导式: {k:v for循环 if判断}
# 3,将如下列表中所有的英文字母修改成大写
lst1 = ["allen","tony","kevin", "sylar"]
lst2 = [item.upper() for item in lst1]
print(lst2)
生成器表达式
生成器表达式: 语法:(数据 for循环 if)
gen = (i**2 for i in range(10))
print(gen.__next__())
print(gen.__next__))
print(gen.__next__())
print(gen.__next__())
# 元组转列表
lst = list(gen)
print(lst)
1.6.9 匿名函数
匿名函数: lambda表达式 语法: 变量 = lambda para1,para2,para3, … : 返回值
def func(a, b)
return a + b
ret = func(13, 12)
print(ret)
fn = lambda a, b: a+b
print(fn) # 打印函数: <function <lambda> at 0x10452ab9o>
ret = fn(12,13)
print(ret)
1.6.10 内置函数(二)
-
zip() : 可以把多个可迭代的元素进行合并
-
locals() : 当前作用域的内容
-
globals() : 拿全局作用域中的内容
-
sorted() : 排序 sorted(iterable, reverse=bool:是否倒序排, key=fn:排序函数)
lst = ["秋","张二嘎","比克","卡卡罗特","超级宇宙无敌大帅B"]
lef func(item):#item对应的就是列表中的每一顶数据
return len (item)
s = sonted(lst, key=func)
s = sonted(lst, key=lambda x : len(x)) # 相等上面
print(s)
# 排序列表字典内的某个内容
s = sorted(lst, key= lambda d:d['age'])
- filter: 筛选, 语法: filter(fn, iterable) 返回生成器对象,需要用list 返回列表
lst = ["张无忌","张三丰","张翠山","灭绝小师太","小狐仙"]
f = filter(lambda x: not x.startswith("张"),lst)
print(list(f))
- map: 映射
lst = [1,2,3,4,5,6,7,8,9]
result = [item * item for item in lst]
print(result)
r = map(lambda x : x*x, lst)
print(list(r))
1.6.11 递归函数
递归: 函数自己调用自己 递归如果没有任何东西拦截的话,它默认就是一个死循环 python默认是有递归深度的限制的.默认的最大递归深度是1000
def func():
if xxx:
return
func()
print(sys.getrecursionlimit()) # 打印最深递归,默认1000
执行递归死循环的话有最深的递归深度,报 递归深度错误