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变量的命名规范:

  1. 必须是数字或字母或下换线组成.
  2. 不能是数字开头,更不能是纯数字
  3. 不能用python的关键字
  4. 不要用中文
  5. 不要太长

1.2 常量

变量的形式:

  1. print(123)
  2. 字母大写的变量 可以 认为是常量。
  3. 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.不包含n
  • range (m, n):从m数到n,不包含n
  • range(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’] 列表特征:

  1. 也像字符串一样也有索引和切片
  2. 索引如果超过范围会报错
  3. 可以用for循环进行遍历
  4. 用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

  1. 字符和编码

    • 二进制: 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 不能直接进行转化。
  2. bytes

  3. str.encode(“编码”): 进行编码

  4. 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 运算符

  1. 算数运算 : +-*/%

  2. 比较运算 : > < >= <= == !=

  3. 赋值运算: = += -= *= a += b 等同于 a = a + b

  4. 逻辑运算: and or not 运算的时候 最好加上括号 以免歧义 优先级: 先算括号内的 > not > and > or

print(True and False or True or not False)
  1. 成员运算: in、 not in

1.5.9 文件操作

mode 模式:

  • r: 读取模式
  • w: 写入模式
  • a: 追加模式
  • b: 读写非文本文件 -》 bytes

with: 上下文, 不需要手动去关闭一个文件

修改文件:

  1. 从源文件中读取内容.
  2. 在內存中进行调整(修改)
  3. 把修改后的内容写入新文件中
  4. 删除源文件.将新文件重命名成源文件
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 函数装饰器

内容回顾:

  1. 函数可以做为参数进行传递
  2. 函数可以作为返回值进行返回
  3. 函数名称可以当成变量一样进行赋值操作

装饰器: -》 要求记住最后的结论 装饰器本质上是一个闭包 作用: 在不改变原有函数调用的情况下,给函数增加新的功能 直白: 可以在函数前后添加新功能,但是不改原来的代码 在用户登录的地方,日志, 通用装饰器的写法: 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. 只能向前不能反复
  2. 特别节省内存
  3. 惰性机制

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 = listgen
printlst

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

执行递归死循环的话有最深的递归深度,报 递归深度错误

1.7

1.7.1

1.7.2

1.7.3

1.7.4

1.7.5