#1.变量
b = "a" #用单引号‘’也可以,也可以是""表示为空,表示字符串,就是文本
b += "c" #变成ac,追加一个c
b = 1 #设置b为数值1
b+=1 #b变成2,追加1
x, y, z = 0, 0, 0 #同时多个变量设置
print(b) #print(b.title()) 首字母大写,upper全大写,lower全小写
x = int(x) #x变成数值
x = 10 #设置变量等于10
def my_function():
global x #声明x是全局变量,否则打印出不来,否则x=20会创建一个内部变量。若是 nonlocal ,则声明是嵌套函数里的局部变量(嵌套函数里的变量下级函数可以直接访问,但是不 nonlocal 不可以修改)
print(x) #输出10
x = 20 #全局x变成了20
print(x) #输出20
my_function() #输出10^n20
#2.字符串
c = f"{a} {b}" #c相当于a连着b,也可以直接print(f"{a} {b}")
print("a:\b\nc\nd") #a:bcd每一个字都换行显示
b = b.rstrip() #删除b右边的空格,lstrip() 是左边,strip()是两侧
b = 是我的.removeprefix('我的') #去掉我的只剩是
b += a.line.lstrip(),在b后面接着写a,并且去除a的左边空格分割字符串为列表
text = "one-two-three-four"
parts = text.split('-', maxsplit=2) # 可以括号里空着,指定-分割,不写就用空格,换行分割,指定最多分割2次。
print(parts) # 输出: ['one', 'two', 'three-four']
#3.数
#**6是6次方
#+-*/ #加减乘除
#% #求余数,比如5%3是2
#print(5+3)是8,print("5+3")是5+3
#浮点数就是小数,有一次浮点,后面都变浮点。除法会产生浮点数,即使4/2数字中加下划线_可以更好辨认,不影响其他
#4.列表
zimu = ['a', 'b', 'c', 'd'] #abcd内容的列表
a = zimu[-3:] #切片,倒数3个,输出字母bcd [0:2] #输出ab,从a(第0个)开始,索引到2(不包括2)
zimu2 = zimu[:] #[:] 切片全部,可用于复制列表,但是zimu如果史叠加引用另外的变量列表等仍会继续引用原本的,若写zimu2 = zimu,一旦zimu列表内容变动,会一起变动
zimu2 = copy.deepcopy(zimu) #这样复制更彻底,直接复制现在的内容,不怕引用。
print(zimu[0].title()) #显示a,并大写(左边第0个),从0开始计数的,-1是最后一个,-2是倒数第二个
#可以用字符串里的f把多个联系起来
zimu[0] = 'e' #把第一个的a改成e
zimu.append('f') #把f加到列表最后
zimu.insert(0, 'g'), #在a前面插入g
del zimu[0] #删除a(就是第一个)
x = zimu.pop(0) #把x变量设置为a,并把a从列表里弹出(删除)
zimu.remove('a') #删除a,只删第一个a,
while 'a' in zimu
zimu.remove('a') #可以删除所有a
zimu.sort() #列表永久按照字母顺序排序
zimu.sort(reverse=True) #字母反向排序
zimu.reverse() #永久按照原本顺序反向
print(sorted(zimu)) #临时按字母顺序显示列表,列表本身不变,反向reverse=True也可以用
len(zimu) #输出列表内个数,结果是4
5.操作列表
for循环
zimu = ['a', 'b', 'c', 'd']
for xx in zimu:
print(xx) #挨个打印所有zimu内的内容
range(1,6) #(调用时才生成)生成整数,从1开始,6之前结束,所以只有1-5
range(start, stop, step) #生成从 start 开始,每次增加 step ,直到达到或超过 stop (不包括 stop )的整数序列。
numbers = list(range(1, 6)) #创建一个列表1-5
for x in range(30): for循环30次
f = [] #创建一个空列表,名字是f
for value in range(1, 11):
p = value ** 2
f.append(p) #把1-10的平方放入列表f[1, 4, 9, 16, 25, 36, 49, 64, 81, 100],也可以1/2合并,写成f.append(value**2)
squares = [value**2 for value in range(1, 11)] #合成一句,叫做列表推导式
min(p) max(p) sum(p) #这是数值列表中的最大最小和平均值
6.元组
#a = (3,5,) 和列表的差别是不可变,省内存,防止不小心改变,但是可以重新再次赋值,比如再来个a = (3,6,)就覆盖了
7.if如果
xx = ['a', 'b', 'c', 'd']
for xy in xx:
if xy == 'b': #两个等号是是否相等,单个=是赋值,!=是不等于,还有<,>,<=,<=(仅数字),if 'b' in xy: xy里有b,not in是没有,
if xy == 'b' and xy <c #可以and连着,也可以or,且或的意思
print(xy.upper()) #upper()全部大写
else:
print(xy)
if-elif-else #第一个if不符合,第二个elif,再不是就else,要是第一个符合就没后面了
if-if-else #不管第一个if,第二个if都会判断
zimu = []
if zimu: #后面换行继续其他代码,若zimu为空,是flase,不执行if,不为空为true,继续执行if的
#8.字典
早饭 = {'品种': '包子', '个数':'5'} #设置一个字典
早饭 = { #竖着写也可以
'品种': '包子',
'个数':'5'}
print(早饭['品种']) #输出包子
早饭['大小'] = '小笼包' #加入早饭字典
早饭['品种'] =' 粥 #把包子改成粥
del 早饭['品种'] #删掉品种
早饭.get('颜色','none(可改或者不写)') #get() 方法的第一个参数用于指定键,是必不可少的;第二个参数为当指定的键不存在时要返回的值,是可选的,这样用get不怕不存在字典而报错
for k, v in 早饭.items(): #items返回所有键和值,然后变量k为键,v为值。 items可以换成key单独返回键,也可以改value单独返回值
print(k,v) #输出品种 包子^n个数 5
for k in sorted(早饭.keys()): #排序后遍历
sorted改set,变成去除重复值,输出的是集合
字典 = {'a': 1, 'b': 2, 'c': 3}
value = 字典.pop('d', '不存在(可以自己改)') # 键 'd' 不存在,返回 '不存在',若不指定会返回KeyError。。。若把d改下c,会返回3
print(value) # 输出 'default_value'
每天的早饭 = [早饭_0, 早饭_1, 早饭_2] #列表嵌套字典,打印第一项显示的是{'品种': '包子', '个数':'5'}
早饭 = {'品种': '包子', '内容': ['a', 'b', 'c', 'd'],} #这是字典嵌套列表,早饭['内容'])相当于列表
早饭 = {'品种': '包子', '用料':{'材料': '牛肉', '重量':'5斤'}} #字典套字典,早饭['用料']['重量']代表5斤
#9.用户输入
x = input("请输入") #提示请输入,x为输入法的值,默认为字符串
x = int(x) #x变成数值
print(x) #显示输入的东西
#10.while循环
a = 1
while a <= 5: 循环到5为止
print(a)
a += 1 #a追加1
#也可以设置一个变量 x=true,while判断是否为true ,while x :就可以判断,=true可以省略
while a=1: #运行到break语句时会结束循环,for,while等循环都可以
x = input(请输入)
if x == '退出':
break #while就结束了,若break改continue,就是函数重新从while循环开始运行。for循环也可以用
未验证 = ['a', 'b', 'c']
已验证 = []
while 未验证: #未验证不为空
待添加 = 未验证.pop() #pop()是从列表里提取所有内容赋值到待添加,pop(0)是提取a
已验证.append(待添加) #添加到已验证里
while 'a' in zimu #循环删除zimu列表里所有的a
zimu.remove('a')
#11.函数
def xx(y,z): #y是形参
def xx(y,z="好好"): 默认z等于好好,可以后面不指定用默认值,也可以指定""表示空白
#形参实参 建议不要等号两侧加空格
print(f"{y} {z}")
aa = f"{y} {z}"
return aa #返回aa,可以返回字典列表变量都可以
xx("你好","不好") 实参 #打印你好不好,再把aa赋值你好不好
xx(y="你好",z="不好") #也可以这样不怕顺序错乱,否则有默认值在前面,不写默认值导致顺序不对
变量 =xx(y="你好",z="不好") #相当于aa #可以函数外调用
#参数可以是字典,列表等,列表可以用 [:] 切片来复制,防止改动原本列表
def xx(y,*z): #形参可以是*z,就是元组
print(z) #还是使用z,输出'a', 'b', 'c'
xx(12, 'a', 'b', 'c') #让*z接收abc变成一个元组,就第一个参宿放入y,后面其他都放入*z
#*z是创建元组,**z是创建字典,xx(12, 品种 =' 粥')这样使用
#12.导入模块
#把函数同目录保存为1.py,然后import 1,就可以导入了,相当于把1.py里的函数写入代码,调用时函数名前改成1.函数名
from 1 import 函数_0 函数_1 函数_2 #导入1.py里的部分函数,调用时可以直接用函数名字,如果用*可以一次导入所有
rom 1 import 函数_0 as xx #把函数0导入并改名成xx
#13.类 比如车是对象,创建一类车的模板叫类,类里的函数叫方法,特斯拉model叫实例
class Car: #创建Car类,一般类首字母大写
def __init__(self, brand, model): #self可以写成别的,后面对应着都修改,self就是car类本身的意思
self.d = brand #可以类里一起用,d一般写成brand,可以改名字
m = model #这样写只能这个def里用
print(m) #可以输出,但是def外其他地方输出不了
self.model= model # 一般这样写可以类里用,或者全局类.self.modle这样调用
self.xxx = 1 #可以自己再设置别的作为类的属性,可以不写在init里,但是只能在所在的方法被调用,仍可以类外面直接改
def describe(self):
print(f"The car is a {self.d} {self.model}.")
# 创建 Car 类的实例 实例字母一般小写
my_car = Car("Tesla", "Model S") #创建一个实例my_car
# 调用实例方法
my_car.describe() # 输出: The car is a Tesla Model S #()里可以填参数,比如3,相应的方法里也需要加参数def describe(self,3):
print(my_car.model) #访问实例的属性,也可以是不在init的xx,比如my_car.xx = 5 可以直接设置属性
#14.子类
class 电动Car(Car): #括号一下,括号里是父类,电动Car 继承自 Car
def __init__(self, brand, model, 电量): #子类需要的属性
super().__init__(brand, model) # 调用父类的构造器来初始化 brand 和 model
self.b = 电量 #添加新的属性 电量
self.其他 = 其他() #属性可以是另一个类,详见后面
def describe_battery(self):
print(f"This electric car has a {self.b}-kWh battery.")
my_电动_car = 电动Car("Tesla", "Model 3", "75") # 创建 ElectricCar 类的实例
my_电动_car.describe() # 输出: The car is a Tesla Model 3 # 调用继承自父类的方法
my_电动_car.describe_battery() # 调用子类特有的方法,输出: This electric car has a 75-kWh battery
#可以重写方法,同名优先子类的方法
class Engine: #可以把类当类的属性,创建一个类,作为后面类里的属性
def __init__(self, horsepower):
self.horsepower = horsepower
def display_horsepower(self):
print(f"This engine has {self.horsepower} horsepower.")
class Car:
def __init__(self, brand, model, horsepower):
self.brand = brand
self.model = model
self.engine = Engine(horsepower) # Car 类的属性继续给到engine
def describe_car(self):
print(f"The car is a {self.brand} {self.model}.")
self.engine.display_horsepower() # 调用 Engine 实例的方法
my_car = Car("Tesla", "Model S", 450) # 创建 Car 类的实例,同时创建 Engine 类的实例作为 Car 实例的属性
my_car.describe_car() # 调用 Car 类的方法输出: The car is a Tesla Model S. 和 This engine has 450 horsepower
my_car.engine.display_horsepower() 这样也可以调用,()里可以填参数,这个函数里没有
from car import Car ,电动car #类可以保存为py,一个py里写多个类,后导入,使用时就是用Car,和写进入一个样
import car 导入整个模块,后面使用就是car.Car,但是上面那句导入可用Car
#模块可以导入模块不限套娃,也可以导入时as别名
#导入其他做好的模块
from random import randint
randint(1, 6) #输出1-6之间的随机数 包括1/6
from random import choice
players = ['1', '2', '3']
first_up = choice(players) #输出123间随机一个
#类和函数一般这种都写个""xxx"来作为文档字符串来描述函数干嘛的
#14.导入文件
from pathlib import Path
path = Path('pi_digits.txt') #路径,可以绝对或相对路径,现在是相对路径,省略PY文件所在目录
contents = path.read_text(encoding='utf-8') #默认会末尾返回一个空字符 ,可以用contents = contents.rstrip()删除最后的空白;(encoding='utf-8')括号里的不填也可以,但是默认编码不一样会读取不到
path.write_text("123") #在该txt写入123,也可以1/n2/n3这样123换行显示
xx = contents.splitlines() #按照行分割成列表,比如"第一行\n第二行\r\n第三行\r第四行",输出['第一行', '第二行', '第三行', '第四行']
print(xx)
#相对文件路径:相对于当前工作目录的路径。例如,如果你的当前工作目录是 /home/user ,那么相对路径 myfolder/myfile.txt 将指向 /home/user/myfolder/myfile.txt 。
#绝对文件路径:从根目录开始的完整路径。例如 /home/user/myfolder/myfile.txt 就是一个绝对路径。
#15.错误处理
try: #尝试运行下面的代码
a = 5/q #q是用户输入的,可能是0
except : xxxError #如果上面的代码没问题,自动跳过这个,如果是出现写的这个错误,执行print
print("你不能除以0") #也可以写pass,就是什么也不做。pass在别地方也可以写,就是啥也不做的意思,但可以用来占个地方以后写。
else: except如果跳过就执行这个,不跳过不执行
print(a)
#else可选,try-except写了,错误了会继续执行后面代码,否则错误了程序停止,else里的只有try顺利才运行
path = Path('username.json') #path可以省略try
if not path.exists(): #文件不存在就执行,去掉not就是存在时执行
else: #文件存在执行
#16.存储数据
from pathlib import Path
import json
numbers = [2, 3, 5, 7, 11, 13] # 定义一个数字列表
path = Path('numbers.json') # 创建一个Path对象,指向将要创建的JSON文件
contents = json.dumps(numbers) # 将数字列表转换为JSON格式的字符串
path.write_text(contents) # 将JSON字符串写入文件
contents = path.read_text()
numbers = json.loads(contents) #返回的就是那个字符串
#17.pytest测试
# test_example.py #创建一个py,可以py里调入其他函数模块来测试,只运行test开头的函数
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5 #断言1 等于大于小于不等等任何都可以
assert add(5, 0) == 5 #断言2
pytest test_example.py #cmd运行,会报告断言失败还是成功
# test_example.py 在所有测试前运行某个代码,用fixture(夹具),下面是示例
import pytest
@pytest.fixture(scope="module")
def my_fixture():
print("Setup: my_fixture")
yield #前面的准备运行测试函数前执行,后面的一个测试函数运行完执行
print("Teardown: my_fixture")
def test_one(my_fixture):
print("Running test_one")
assert True
def test_two(my_fixture):
print("Running test_two")
assert True
#运行顺序:yield前,测试1,yield后,yield前,测试2,yield后
def pytest_sessionstart(session):
print("xx") #在测试会话开始时调用,整个测试会话只调用一次。可以用来执行一些会话级别的设置
def pytest_sessionfinish(session,exitstatus): #就是会话结束时运行。session是当前会话的意思,exitstatus参数是一个整数,表示测试会话的退出状态。这个值通常由 pytest设置,若为0是运行成功,根据情况调用。