寒点 发表于 2024-12-3 10:32:17

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]
查看完整版本: Python基础