Python基础
一、数据类型1. 变量
1.1 定义
[*]Python 与其他语言的区别:
[*]Python:变量相当于标签
[*]其他语言:变量相当于容器
[*]先赋值后使用
str = "hello"
print(str)1.2 变量的数据类型
[*]静态类型语言:在使用变量之前定义其数据类型
[*]动态类型语言:在给变量赋值时确定其数据类型,对变量的每一次赋值,都有可能改变变量的类型
【Python 就是动态类型语言】
1.3 查看变量数据类型
[*]语法:type(变量)
[*]可以直接输出,也可以用变量存储结果再输出
[*]type()查看的是变量存储的数据的类型,即变量无类型
2. 标识符
[*]由字母、数字、下划线组成,不能以数字开头,且区分大小写(可用中文,但不推荐)
[*]单独的下划线_是一个特殊变量,表示上一次运算的结果
[*]见名知意
[*]关键字大写后可作为标识符
>>> 55
55
>>> _+100
1553. 字面量
[*]在代码中被写下来的固定的值
[*]Python 中常用的6种数据类型
类型描述说明数字(Number)支持:整数、浮点数、复数、布尔复数:4+3j(以 j 结尾表示复数)字符串(String)描述文本的一种数据类型由任意数量的字符组成列表(List)有序的可变序列可有序记录一堆数据(最常用)元组(Tuple)有序的不可变序列可有序记录一堆不可变的数据集合集合(Set)无序不重复集合可无序记录一堆不重复的的数据集合字典(Dictionary)无序 Key-Value 集合可无序记录一堆 Key-Value 型的数据集合
[*]科学计数法
[*]e(E)表示以10为底的指数,e 之前为数字部分,之后为指数部分,而两部分必须同时出现,指数必须为整数
45e-5 # 0.00045
[*]复数型数据
a+bJ 或 a+bj可通过x.real和x.imag来分别获取 x 的实部和虚部,结果都是浮点型
>>> x.real
12.0
>>> x.imag
34.04. 转换类型
4.1 为什么
[*]从文件中读取的数字,默认是字符串,需要转换成数字类型
[*]input()语句默认结果是字符串,有数字也需要转换
[*]将数字转换成字符串用以写出到外部系统
4.2 常见的转换语句
语句(函数)说明int(x)转换为整数float(x)转换为浮点数str(x)将对象 x 转换为字符串注:浮点数转换为整数时会丢失精度
二、注释
[*]单行注释
# 我是单行注释
[*]多行注释
"""
我是多行注释
"""
[*]工作日志说明:进行没有完成的功能备注
# TODO 说明文字三、运算符
1. 算术运算符
[*]基本运算:加、减、乘、除、取余
[*]其他:
[*]//:取整除,c **= a等价于c = c ** a
[*]**:指数,c //= a等价于c = c // a
2. 链式比较
在 Python 中,可以使用链式比较对多个值进行比较,简化代码
x = 5
print(1 < x < 10)# 输出 True,相当于 1 < x and x < 10
print(1 < x > 3)# 输出 True,相当于 1 < x and x > 3
print(1 <= x < 5)# 输出 False,相当于 1 <= x and x < 5嵌套语句:
length = 23
height = 23
width = 6
if length == height and height == width and width == length:
print("This is a cube")
else:
print("This is a cuboid")
# 简化代码
if length == height == width:
print("This is a cube ")
else:
print("This is a cuboid ")注意条件设置,避免造成死循环
2. 补充知识
2.1 print 输出不换行
默认 print 输出时自动换行,只要在print中加上end = ' ',即可输出不换行
name = input()2.2 制表符 \t
可以实现多行字符串对齐
案例:打印九九乘法表
name = input("你是谁?")
print("哦,你是:%s" % name)示例:
id(object) # object:任何对象,字符串、数字、列表等等4.4 Union 类型
4.4.1 引入
[*]这种情况好写
del x
[*]下面这种情况怎么写类型注解呢?
if 条件:
...
elif 条件2:
...
else:
...4.4.2 语法
[*]Union 联合类型注解,在变量注解、函数(方法)形参和返回值注解中均可使用
if guess == secret:
print("猜中了!")
else:
if guess > secret:
print("猜大了")
else:
print("猜小了")5. 多态
同一个行为,使用不同的对象获得不同的状态
5.1 说明
[*]多态常作用在继承关系上
[*]函数(方法)形参声明接收父类对象,实际传入子类对象进行工作
5.2 抽象类(接口)
抽象类:含有抽象方法的类
抽象方法:没有具体实现的方法(pass)
[*]抽象类是对子类的一种软性约束,要求子类必须实现父类的一些方法
[*]配合多态使用,获得不同的工作状态
[*]多用于做顶层设计(设计标准),以便子类具体实现
[*]父类用来确定有哪些方法(类似于标准)
[*]具体的方法实现,由子类自行决定
while 条件:
...十六、Python 操作数据库
1. 安装与连接
[*]在 Python 中使用pymysql来操作 MySQL
while guess != 8:
temp = input("猜错了,请重新输入:")
guess = int(temp)
if guess == secret:
print("猜中了!")
else:
if guess > secret:
print("猜大了")
else:
print("猜小了")
[*]连接
while 条件1:
...
while 条件2:
...2. 执行SQL语句
[*]执行非查询性质的 SQL 语句(创建表等...)
[*]执行查询性质的 SQL 语句
[*]fetchall()得到全部的查询结果封装入元组内
print("hello", end = '')
print("world", end = '')3. 提交
pymysql 库修改数据库时,需要通过链接对象的 commit 成员方法来进行确认,只有确认后,修改才生效
3.1 手动提交
i = 1
while i <= 9:
j = 1
while j <= i:
print(f"{j} * {i} = {j * i}\t", end='')
j += 1
i += 1
print()示例:
# 导包from pymysql import Connection# 获取到MySQL数据库的链接对象conn = Connection( host='localhost', # 主机名(或IP地址) port=3306, # 端口,默认3306 user='root', # 账户名 password='root' # 密码)# 获取游标对象cursor = conn.cursor()# 选择数据库conn.select_db("world")# 执行sqlcursor.execute("insert into student values(1001, '周杰伦', 31, '男')")# 手动提交i = 1
while i <= 9:
j = 1
while j <= i:
print(f"{j} * {i} = {j * i}\t", end='')
j += 1
i += 1
print()# 关闭到数据库的链接conn.close()3.2 自动提交
[*]在获取到MySQL数据库的链接对象时设置
name = "itheima"
# for 循环处理字符串
for x in name:
print(x)示例:
conn = Connection( host='localhost', # 主机名(或IP地址) port=3306, # 端口,默认3306 user='root', # 账户名 password='root' # 密码 name = "itheima"
# for 循环处理字符串
for x in name:
print(x) # 设置自动提交)十七、闭包
1. 案例引入
for x in range(5, 10):
print(x)
[*]尽管功能实现是可以的,但是仍有问题
[*]代码在命名空间上(变量定义)不够干净、整洁
[*]全局变量有被修改的风险
2. 语法定义
[*]定义双层嵌套函数,内部函数可以访问外部函数的变量,且外部函数返回了内部函数
[*]将这个使用外部函数变量的内部函数称为闭包
[*]优化后的代码如下
# 必须先定义后使用
def 函数名(传入参数):
函数体
return 返回值
函数名(参数)3. 简单闭包
def say_hi():
print("hi")
result = say_hi()
print(f"无返回值函数,返回的内容是:{result}") # None
print(f"无返回值函数,返回的内容类型是:{type(result)}")# <class 'NoneType'>4. 修改外部函数变量的值
[*]使用nonlocal关键字修饰外部函数的变量
[*]nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)
return None5. 优缺点
[*]优点
[*]不定义全局变量也可以让函数持续访问和修改外部变量
[*]闭包函数引用的外部变量是外层函数的内部变量,作用域封闭难以被误操作修改
[*]缺点
[*]内部函数持续引用外部函数的值,导致这部分内存空间不被释放,一直占用内存
6. 装饰器
[*]创建一个闭包函数,在闭包函数内调用目标函数【装饰器就是一种闭包】
[*]在不改动目标函数的前提下,为目标函数增加新功能
[*]引入
def func(x, y):
"""
函数说明
:param x: 形参x的说明
:param y: 形参y的说明
:return: 返回值的说明
"""
[*]希望给 sleep 函数增加一个功能
[*]调用 sleep 前输出:我要睡觉了
[*]调用 sleep 后输出:我起床了
[*]下列写法也可以实现,但不推荐
num = 100
def testA():
print(num)
def testB():
global num
num = 200
print(num)
testA()
testB()
print(f"全局变量 num = {num}")
[*]优化(一般写法)
def outer(func): def inner(): print("我要睡觉了") func() print("我起床了") return innerdef func(x, y):
"""
函数说明
:param x: 形参x的说明
:param y: 形参y的说明
:return: 返回值的说明
"""fn = outer(sleep)fn()
[*]装饰器的语法糖写法
[*]使用@outer,定义在目标函数之上
def outer(func): def inner(): print("我要睡觉了") func() print("我起床了") return inner@outerdef func(x, y):
"""
函数说明
:param x: 形参x的说明
:param y: 形参y的说明
:return: 返回值的说明
"""sleep()十八、设计模式
[*]设计模式是一种编程套路,可方便程序开发
[*]最常见的设计模式是面向对象
[*]此外还有许多设计模式
[*]单例模式、工厂模式
[*]建造者、责任链、状态、备忘录、解释器、访问者、观察者、中介、模板、代理模式等等
1. 单例模式
[*]确保某一个类只有一个实例存在,并提供一个访问它的全局访问点
[*]节省内存以及创建对象的开销
[*]实现
def user_info(name, age, gender):
print(f"您的名字是:{name}, 年龄是:{age}, 性别是:{gender}")
user_info(name = 'TOM', age = 20, gender = '男')
# 可不按照固定顺序
user_info(age = 20, name = 'TOM', gender = '男')
# 可与位置参数混用
user_info("小明", age = 20, gender = "男")2. 工厂模式
[*]当需要大量创建一个类的实例时,可以使用工厂模式
[*]基于工厂提供的方法来创建对象
[*]原始代码
def user_info(name, age, gender='男'):
print(f"您的名字是:{name}, 年龄是:{age}, 性别是:{gender}")
user_info('TOM', 20)
user_info('Rose', 18, '女')
[*]优化后的代码
[*]使用工厂类的get_person()方法去创建具体的类对象
def user_info(*args):
print(args)
user_info('TOM')
user_info('TOM', 18)
[*]优点
[*]大批量创建对象时有统一的入口,易于代码维护
[*]当发生修改,仅修改工厂类的创建方法即可
[*]符合现实世界的模式,即由工厂来制作产品(对象)
十九、多线程
1. 进程、线程
[*]进程:程序在操作系统内运行,即成为一个运行进程,并分配进程ID方便系统管理
[*]线程:进程内部可以有多个线程,程序的运行本质上是由进程内部的线程在实际工作
[*]类比:进程好比一家公司,而线程为公司的员工
[*]进程之间内存隔离,即不同的进程拥有各自的内存空间
[*]线程之间内存共享,线程属于进程,一个进程内的多个线程之间共享这个进程所拥有的内存空间
2. 并行执行
同一时间做不同的工作
[*]多任务并行执行:不同的程序同时运行
[*]多线程并行执行:一个进程内的多个线程同时运行
3. 多线程编程
3.1 threading 模块
def user_info(**kwargs):
print(kwargs)
user_info(name = 'TOM', age = 18, id = 110)3.2 示例1
def demo(*args, **kwargs):
print(args)
print(kwargs)
# 元组、字典变量
gl_nums = (1, 2, 3)
gl_dict = {"name": "小明", "age": 18}
demo(*gl_nums, **gl_dict) # 等价于demo(1, 2, 3, "name": "小明", age=18)3.3 示例2
def test_func(compute):
result = compute(1, 2)
print(f"compute参数的类型是:{type(compute)}")
print(f"计算结果是:{result}")
def compute(x, y):
return x + y
test_func(compute)二十、网络编程
1. Socket
socket(简称套接字)是进程之间通信的工具,负责进程之间的网络数据传输
2. 客户端和服务端
[*]Socket 服务端:等待其他进程的连接、可接收发来的消息、可回复消息
[*]Socket 客户端:主动连接服务端、可以发送消息、可以接收回复
2.1 服务端
[*]创建 socket 对象,并绑定 ip 地址和端口
[*]服务端开始监听端口
lambda 传入参数: 函数体
[*]接收客户端连接,获得连接对象
def test_func(compute):
result = compute(1, 2)
print(result)
test_func(lambda x, y: x + y)
[*]回复与发送消息
变量名 = [元素1, 元素2, 元素3, ...]
# 定义空列表
变量名 = []
变量名 = list()具体示例:
class Student:
def add(self, x, y):
return x + y2.2 客户端
student = Student()
num = student.add(1, 2)二十一、正则表达式
一种字符串验证的规则,通过特殊的字符串组合来确定规则
1.Python re模块
方法说明match(匹配规则, 被匹配字符串)从被匹配字符串开头进行匹配,匹配第一个命中项(含匹配的信息),匹配失败返回空search(匹配规则, 被匹配字符串)全局匹配,从前往后找,找到第一个后就停止,不会继续向后;若找不到返回Nonefindall(匹配规则, 被匹配字符串)全局匹配,找出全部匹配项;找不到返回空 list示例1:
myList =
# 查询
index = myList.index(2)
print(f"元素2在列表中的下标索引值是:{index}") # 结果:1
# index = myList.index(4) # 报错
# print(f"元素4在列表中的下标索引值是:{index}")
# 修改
myList = -1
print(f"列表被修改元素值后,结果是:{myList}") # 结果:[-1, 2, 3]
# 插入
myList.insert(1, 6)
print(f"插入666后的结果:{myList}") # 结果:[-1, 6, 2, 3]
# 追加
# 方式1:append
myList.append(4)
print(f"append追加单个元素:{myList}") # 结果:[-1, 6, 2, 3, 4]
myList.append()
print(f"append追加列表:{myList}") # 结果:[-1, 6, 2, 3, 4, ]
# 方式2:extend
myList.extend()
print(f"extend追加列表:{myList}") # 结果:[-1, 6, 2, 3, 4, , 4, 5, 6]
# 删除
# 方式1:del
del myList
print(f"del删除:{myList}") # 结果:[-1, 6, 2, 3, 4, 4, 5, 6]
# 方式2:pop
element = myList.pop(0)
print(f"pop删除:{myList}") # 结果:
# 删除某元素在列表中的第一个匹配项
myList.remove(6)
print(f"remove删除:{myList}") # 结果:
# 统计某元素在列表内的数量
print(f"count:{myList.count(4)}") # 结果:2
# 统计列表内有多少元素
print(f"len:{len(myList)}") # 结果:6
# 清空列表内容
myList.clear()
print(f"清空列表:{myList}") # 结果:[]示例2:
index = 0
while index < len(列表):
元素 = 列表
对元素进行处理
index += 12. 元字符匹配
2.1 单字符匹配
字符功能.匹配任意1个字符(除了\n),\.匹配点本身[]匹配 [] 中列举的字符\d匹配数字,即0-9\D匹配非数字\s匹配空白,即空格、tab\S匹配非空白\w匹配单词字符,即a-z、A-Z、0-9、_\W匹配非单词字符2.2 数量匹配
字符功能*匹配前一个规则的字符出现0至无数次+匹配前一个规则的字符出现至少1次?匹配前一个规则的字符出现0次或1次匹配前一个规则的字符出现m次匹配前一个规则的字符出现至少m次匹配前一个规则的字符出现m至n次2.3 边界匹配
字符功能^匹配字符串开头$匹配字符串结尾\b匹配一个单词的边界\B匹配非单词边界2.4 分组匹配
字符功能|匹配左右任意一个表达式()将括号中字符作为一个分组2.5 示例
for element in my_list:
print(f"列表的元素有:{element}")二十二、递归
方法(函数)自己调用自己
变量名 = (元素1, 元素2, ...)
# 定义空元组
变量名 = () # 方式1
变量名 = tuple() # 方式2
# 定义只有一个元素的元组,后面必须有逗号,否则就不是元组类型
t = ('hello', )
[*]os 模块三个基础方法
t1 = (1, 2, ['itheima', 'itcast'])
t1 = 'best'
print(t1) # 结果:(1, 2, ['itheima', 'best'])1. 案例:递归找文件
# ,拼接
from string import Template
print('str1:', 'hello', 'world')
# +拼接
str2 = 'hello' + '12'
print(f"str2:{str2}")
# 空格拼接
str3 = 'hello' 'world'
print(f"str3:{str3}")
# 换行自动拼接
print("str4:"
"hello"
"world")
# 乘法*拼接
str5 = 'a-' * 10
print(f"str5:{str5}")# a-a-a-a-a-a-a-a-a-a-
# str.join()
myList = ['你', '好', '世', '界']
str6 = '-'.join(myList)
print(f"str6:{str6}")
# string模块的Template对象
t = Template('${s1} ${s2}!')
str7 = t.safe_substitute(s1='hello', s2='world')
print(f"str7:{str7}")2. 注意点
[*]注意退出条件,否则容易变成无限递归
[*]注意返回值的传递,确保从最内层,层层传递到最外层
二十三、json文件
[*]json 基于文本,独立于语言的轻量级的数据交换格式,本质上是一个带有特定格式的字符串
[*]基于文本:是一个文本文件
[*]独立于语言:不是某个语言特有的,每种编程语言都可以使用
[*]轻量级:相同数据,相比于其他格式,占用的大小较小
[*]数据交换格式:后端程序员给前端的数据(json、html、xml)
[*]可以直接使用read()和write()方法去操作文件,但是不方便,所以使用 json 文件自身特有的读取和写入方法
[*]在做测试时,常将测试数据定义为 json 文件格式,使用代码读取 json 文件,即读取测试数据,进行传参(参数化)
[*]JSON 作用:使不同的语言能够互相传递数据
1. 语法
[*]主要数据类型:对象{}和数组[],类似 Python 中的字典和列表(可相互嵌套)
[*]一个 json 文件是一个对象或数组
[*]json 中的对象由键值对组成,每个数据之间用逗号隔开,最后一个数据后不用写逗号
[*]json 中的字符串必须用""
[*]json 中的其他数据类型
[*]数字 ---> int float
[*]字符串 string ---> str
[*]布尔 true、false ---> True、False
[*]null ---> None
[*]示例:
name = "黑马程序员"
msg1 = "学IT就来%s" % name # %s是占位符
print(msg1)
# 多个变量要用括号括起来,并按照占位的顺序填入
tel = 123456789
msg2 = "我的名字:%s, 电话:%s" % (name, tel) # tel的占位符可用%d
print(msg2)2. 读取 json 文件
[*]json.load(文件对象),返回的是字典或列表
f"内容{变量}"3. 换成 [(), (), ()] 格式
某网站的测试数据如下,需求:提取 json 文件中的用户名、密码和预期结果,组成:[(), (), ()] 格式(自动化参数化需要的数据格式)
name = "传智播客"
set_up_year = 2006
stock_price = 19.99
print(f"我是{name},我成立于:{set_up_year},我今天的股票价格是:{stock_price}")4. json 的写入
f.write(字符串)不能将Python的列表和字典作为参数传递,如果要写入 json 文件,则使用 json 特定的方法
[*]json.dump(Python中的数据类型, 文件对象)
内容.format(变量)5. Python 数据和 Json 数据的相互转化
# {}中数字表示使用第几个参数
message_content = """
金{0}贺岁,欢乐祥瑞。
金{0}敲门,五福临门。
给{1}及家人拜年啦!
""".format(year, name)
# 使用变量占位
message_content = """
金{current_year}贺岁,欢乐祥瑞。
金{current_year}敲门,五福临门。
给{receiver_name}及家人拜年啦!
""".format(current_year = year, receiver_name = name)注:如果有中文,带上ensure_ascii=False来确保中文正常转换
示例:
gpa_dict = {"Tom": 3.251, "Amy": 3.864, "John": 4.105}
for name, gpa in gpa_dict.items():
print("{0}你好,你当前的绩点为:{1:.2f}".format(name, gpa))
for name, gpa in gpa_dict.items():
print(f"{name}你好,你当前的绩点为:{gpa:.2f}")
来源:https://www.cnblogs.com/iRuriCatt/p/18583113
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页:
[1]