栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

我的【python基础】笔记

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

我的【python基础】笔记

Python代码规范( PEP 8 版本 )
  • 缩进采用4个空格
  • 行长一般不超过72字符
  • 注意空行
输入输出
print()    # 输出括号内容
  • print默认end=‘n’
  • print支持格式化输出
print("%d" % n)    # 与C语言格式化输出类似,但使用%

print(f"{变量名}")

print("{}".format(值))
input()    # 输入,参数为提示
  • input默认为字符串格式
  • 若希望使用空格来连续输出,可以使用split()方法,然后取下标分别获取空格前后的内容
s = input().split()
A = int(s[0])
B = int(s[1])
C = int(s[2])
score = A * 0.2 + B * 0.3 + C * 0.5
print("%d" % score)
变量 命名规则
  • 只包含字母、数字、下划线

  • 不能有空格,首字母不能是数字

  • 不能使用函数名或关键字

建议

简短具有描述性

少用小写i或大写O

命名空间

变量存储的位置,每一个变量都存储在命名空间中

locals()    # 返回当前命名空间

x = 1
print(locals())    # 返回全局命名空间
变量相关函数

函数名(变量名)

type()    # 获取变量类型
id()    # 获取内存地址
ord()    # 获取该字符的ASCII码
chr()    # 获取该整数对应的字符
数字
  • 整数 int
  • 浮点数 float
abs()    # 取绝对值
布尔

只有True 和 False两个值

作用域

指变量的生效区域

  • 全局作用域:所有函数以外的位置
  • 函数作用域:函数内的位置
    • 函数调用时创建,调用一次创建一次作用域

变量的查找规则变量访问从所在作用域开始寻找,一层层向外扩展

global x    # 声明后x为全局变量
nonlocal x    # 声明后x为函数变量,用在嵌套函数中,修改上一层函数
运算符 算术运算符
运算符说明实例结果
+加12.45 + 1527.45
-减4.56 - 0.264.3
*乘5 * 3.618.0
/除法(和数学中的规则一样)7 / 23.5
//整除(向下取整)7 // 23
%取余,即返回除法的余数7 % 21
**幂运算/次方运算,即返回 x 的 y 次方2 ** 416,即 24
1. / 的 结果一定是浮点数
2. // 保留整数部分
3. 如果运算中有小数参与,最后的结果一定小数
逻辑运算符
逻辑运算符含义基本格式说明
and逻辑与运算,等价于数学中的“且”a and b当 a 和 b 两个表达式都为真时,a and b 的结果才为真,否则为假。
or逻辑或运算,等价于数学中的“或”a or b当 a 和 b 两个表达式都为假时,a or b 的结果才是假,否则为真。
not逻辑非运算,等价于数学中的“非”not a如果 a 为真,那么 not a 的结果为假;如果 a 为假,那么 not a 的结果为真。相当于对 a 取反。

优先级为:not > and > or

比较运算符
比较运算符说明
>大于,如果>前面的值大于后面的值,则返回 True,否则返回 False。
<小于,如果<前面的值小于后面的值,则返回 True,否则返回 False。
==等于,如果==两边的值相等,则返回 True,否则返回 False。
>=大于等于(等价于数学中的 ≥),如果>=前面的值大于或者等于后面的值,则返回 True,否则返回 False。
<=小于等于(等价于数学中的 ≤),如果<=前面的值小于或者等于后面的值,则返回 True,否则返回 False。
!=不等于(等价于数学中的 ≠),如果!=两边的值不相等,则返回 True,否则返回 False。
身份运算符
运算符描述实例
isis 是判断两个标识符是不是引用自一个对象x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
is notis not 是判断两个标识符是不是引用自不同对象x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。

身份运算符用来比较 两个对象的存储单元(地址)

成员运算符
运算符描述实例
in如果在指定的序列中找到值返回 True,否则返回 False。x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in如果在指定的序列中没有找到值返回 True,否则返回 False。x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。
三目运算符
a if a > b else b    # 如果a>b成立,结果为a,不成立结果为b
运算符优先级
运算符说明Python运算符优先级结合性
小括号( )19无
乘方**16右
符号运算符+(正号)、-(负号)14右
乘除*、/、//、%13左
加减+、-12左
比较运算符==、!=、>、>=、<、<=7左
is 运算符is、is not6左
逻辑非not4右
逻辑与and3左
逻辑或or2左
序列

序列方法函数一般情况下可通用

序列类型可以解包赋值

  • 序列遍历方式

    # 第一种 变量名存储数字,用下标取元素  可以拿下标
    for 变量名 in range(len(序列名)):
    	print(序列名[变量名])
    
    # 第二种 注意直接是变量名 编写简单速度快
    for 变量名 in 序列名:
    	print(变量名)
    	
    
字符串

使用‘ “ ‘’‘括起来的内容,其中’''可跨行

字符串是一种序列,序列包括字符串、列表、元组

f字符串

f是format(格式)的简写,实现在字符串中插入变量的值,类似C语言中的格式化输入输出方法

语法:

f"{变量名1}{变量名2}..."

示例:

first_name = 'han'
last_name = 'chuanwang'
full_name = f"{first_name} {last_name}"
print(full_name)
r字符串

原始字符串,

r" "    # 使转义字符失效
字符串相关常用方法

字符串名.方法名(参数)

字符串不可被改变

.title()    # 首字母大写 以空格为划分

.upper()    # 大写

.lower()    # 小写

.strip()    # 清楚两侧空白

.lstrip()    # 清除左侧空白

.rstrip()    # 清除右侧空白

.split()    # 通过指定分隔符对字符串进行切片,默认为空格,转换为列表形式,不改变原值

.(r)find(s, start=0,end=len(str))    # 指定一个范围去查找子串s并返回下标(第一次出现子串s的下标),若查找失败返回-1,start默认为0,end默认字符串长度,加r反向查找

.index(s, start=0,end=len(str))    # 与find基本一致,但如果查找失败直接报错 

.count(s)    # 返回子串s的个数

.replace(old, new, max)    # old要替换的子串,new新的子串,max替换次数默认为所有

.'指定字符'.join()    # 与split相反,通过指定符号连接,转换为字符串格式

.isdigit()    # 判断是否是数字
字符串相关常用函数 转义字符
  • n 换行

  • t 制表符

  • 转义用

列表

由一系列按特定顺序排列的元素组成,用[]来表示,并用“,”来分割其中的元素,可以同时存储不同数据类型

列表是序列

  • 创建列表:
numbers = [1, 2, 3, 4, 5]
numbers = [value for value in range(1,6)]    # 列表生成式
numbers = list(range(1,6))    # 强制类型转换
列表相关常用方法:

列表是可变类型

.append(元素)    # 将新元素添加到列表list末尾

.insert(索引,元素)    # 将新元素插入到列表list对应的索引位置,默认元素后移

.pop(索引)    # 弹出(删除)索引对应的列表中的元素,不加索引默认弹出最后一个元素。可以用一个变量存储被弹出的元素

.remove(元素)    # 删除列表中的出现的第一个与元素一致的元素,不存在会报错

.sort()   # 按字母顺序排列列表内容,会更改列表数据

.reverse()   # 反转列表的元素排列,会改变原来序列内容

.clear()    # 清空列表,会更改原来内容

# 注意:将reverse = True 作为参数传入方法中将实现与原方法排序相反的(倒序)的效果
列表相关常用函数:
sorted(序列名, key=func)    # 临时改变列表的顺序,不会更改原始列表内容,可以使用函数进行选择排序基准

len(序列名)    # 获取列表长度

min(序列名)    # 最小值

max(序列名)    # 最大值

sum(序列名)    # 求和

reversed(序列名)    # 反转序列内容等于切片中的反转
切片
序列[start:end:step] 来截取响应的字符串
start : 开始的下标
end   : 结束的下标(包头不包尾)
step  : 步长 默认为1

start如果为空,则默认从头开始切 如果 步长是正数 头在左边 如果 步长是负数头在右边
end如果为空,则默认切到最后 如果 步长是正数 尾巴在右边 如果 步长是负数尾巴在左边

#列表名[start : stop :step] # 包头不包围列表名[::-1] # 列表反转python

元组
a = (1, 2, 3)
a, b, c = (1, 2, 3)    # a=1,b=2,c=3(解包)

值不可改变的列表,使用()而不是[]

元组是一种序列,序列方法函数通用

若元组内只有一个元素,末尾要加,

()不加逗号会被python当作结合语法

元组相关函数
enumerate(序列名) # 将序列元素和对应的元素内容组成元组
其他
range(start,stop,step)    # 等差数字序列
有趣的示例
# 一串字符中的数字和字母分开提取出来
str_nums = '1this 2is a 345demo6 fo7r8 fun9'
int_nums = []
str_char = ''

for char in str_nums:
    try:
        int_nums.append(int(char))
    except ValueError:
        str_char += char

print(int_nums)
print(str_char)

i = input().split()
循环

编程小技巧:先写死,再变量化:)

for循环 for循环用法
# 循环输出1,2,3,4
for value in range(1,5):    
	print(value)

可迭代对象 内置有__iter__方法就是可迭代对象

for循环内部本质

1.调用可迭代对象的iter方法返回一个迭代器

2.不断调用next方法

3.处理异常

选择分支 pass关键字

应该填充内容的代码块可以先不写,使用pass跳过

pass 没有任何作用,暂时跳过
if语句
# 从上往下判断,如果为True则不往下执行了
if 条件表达式1:
    执行语句1
elif 条件表达式2:
    执行语句2
elif 条件表达式3:
    执行语句3
else:
    执行语句4

if 如果 elif 否则如果 else 否则

elif 这个条件可以是0个,也可以有多个

elif 如果有一个满足,剩下的表达式通通不执行,只执行那一个代码块

字典

在python中,字典是一系列键值对。每个键都与一个值相关联,可以使用键来访问相关联的值

创建字典
# 创建一个字典
字典名称 = {
		键:值,
		键:值
		}
访问字典
# 访问字典中的值
字典名[键]
添加键值对
字典名[要添加的键] = 该键对应的值
更改键值信息
字典名[要更改值的键] = 更改的值
删除键值对
del 字典名[键名]    # del语句会直接删除,可以用在多种删除中
字典相关常用方法
get(键名, 键不存在时要返回的值)    # 第一个参数不可省略,第二个参数默认为None

items()    # 返回一个键值对列表,可用于遍历字典
遍历字典
# 方法一
python_words = {
    'int': "整型",
    'float': "浮点型",
    'str': "字符串",
    'list': "列表",
}
for key, value in python_words.items():    # 使用item方法取得键值对列表,用两个变量分别表示键和值的内容
    print(f"{key} means:{value}")
    
# 方法二
favorite_numbers = {
    'Bob': 1,
    'stark': 2,
    'jack': 3,
    'bruce': 4,
    'han': 5
}
for name in favorite_numbers:
    print(f"{name}'s favorite number is {favorite_numbers[name]}") 
可变类型和不可变类型
  • 可变:列表,字典,集合
  • 不可变:数字,字符串,元组
散列类型
  • 无序,不存在下标
  • 内部元素不重复
集合(set)

语法:

集合名 = {1, 2, …}

当创建空集合时需要使用set(),因为{}会被判定为字典

存储不重复的内容,通常用来去重

使用场景:身份证,二维码,邮箱地址等

集合性质
  • 唯一性:元素唯一存在,不重复
  • 可变性:集合可以通过相关方法进行修改
  • 无序性:元素没有下标,无顺序,不能通过下标来提取

集合中不能放列表

集合运算

& 交集 取公共元素

| 并集 取两集合共同元素

- 差集 左面集合减交集

in 判断是否在集合里面

集合相关方法
.add()    # 参数为所添加的元素,元素位置不确定

.update()    # 参数通常为序列类型,并将序列类型拆分后插入

.pop()    # 随机删除一个元素,但实际上并不是随机的,默认从左开始删,仅在集合元素是字符串,并在cmd中默认删除

.remove()    # 参数为元素内容,若元素不存在则报错

.discard()    # 同remove,但是元素不存在不会报错

.clear()    # 清空
字典(dict)

用来存储典型的“对应关系”的数据类型(键(key)值(value)对)

语法

字典名 = {
    键名1 : 值,
    键名2 : 值,
    ...
	}

取值:
字典名[键名]
字典性质
  • 无序,无下标,字典可以通过键来访问数据

  • 不重复,键不可以重复,值可以。若重复选择最后一个键的值

  • 可变性,字典内的数据可变,且可以嵌套(可以嵌套序列或者再嵌套一个字典)

    cities = {
        "濮阳市": {
            "省份": "河南",
            "别名": "龙乡"
        },
        "天津市": {
            "省份": "天津",
            "别名": "九河下梢天津卫"
        }
    }
    for key, value in cities.items():
        print(f"{key}:{value['省份']}{value['别名']}")
    
字典相关常用方法
.setdefault(键名,值)    # 新增一个键,值默认为空None
# 一般不使用setdefault,增加键值对可以直接赋值

.pop()    # 参数:删除指定的键

.clear()    # 清空字典内容

.update()    # 参数为键值对,如果没有这个键值对,就新增一个

.get()    # 参数键名,获得键值,默认若没有会返回None,可以自定义返回内容

.keys()    # 获得所有的键

.values()    # 获得所有的值

.items()    # 返回键值对,并封装成元组
函数

函数可以用来保存可执行的代码,实现某个功能,需要先定义再使用

定义函数语法
def 函数名(形参):    # 函数名规则与变量类似,形参可以赋默认值
    函数内容

函数中的代码不会自动执行,需要调用

调用函数语法
函数名(实参)

优点:

  • 减少代码量
  • 提升代码项目的结构性,提高可读性
  • 便于后期维护
# 两个形参,形参之间用逗号隔开
def login(username, password):
    if username == 'root' and password == '123456':
        print('登陆成功')
    else:
        print('登陆失败')


user_name = 'root'
pass_word = '123456'
login(user_name, pass_word)    # 传入实参

print(login)    # 函数login(没有加括号)所在的内存地址
实参的传入方法:
# 1.位置参数 实参对应形参顺序,依次传入
login(user_name, pass_word)
# 2.关键字参数 使用形参名将实参准确赋值给形参
login(password=pass_word,username=user_name)

混合使用关键字参数和位置参数时,必须把位置参数写在前面

函数的参数 可变参数(不定长参数) *args

定义形参时,再形参前加*号,这种形参可以获得所有的位置形参,将所有的形参保存在一个元组中

def fn(*a):
    print(a)


fn(5,6,7,8)

(5, 6, 7, 8)    # 运行结果
  • * 可以接收所有的实参,并将参数装在一个元组中(装包)
    • 一个函数中只能有一个可变参数
    • 可以和其他参数混合使用,但必须写在最后
    • 一般取名*args
**kwargs
  • **形参可以接收任意的关键字参数,会将这些参数同意保存到字典中,字典的键就是参数的名字,字典的值就是参数的值
    • **形参只能有一个,写在最后面
参数解包
  • * 序列名    # 传递实参时,`*序列名 `可以将序列类型中的元素依次作为参数传递
    
    • 需要保证序列中的元素可以被形参一一接受
  • **为字典解包,字典键的名字需要和形参相同

返回值
return 函数的结果    # 函数的结果可以是任意的,但是必须是单值
return 1,2,3    # 结果是元组(1, 2, 3)
def fn():
    def fn2():
        print('h')

    return fn2


r = fn()    # fn()此时就是return的 fn2
r()    # 等价于fn2()
None
  • python中None表示空值

函数没有返回值默认为None

函数进阶 函数可以被引用(赋值)
def fn():
    pass


f = fn
print(f)    # 输出的是fn的地址
函数可以作为参数传递给另一个函数
def fn2(x):
    print(x)

    
fn2(fn)    # 直接传fn,传的是fn函数的地址
函数可以作为返回值传递给另一个函数
def fn(x):
    return x


def fn2(y):
    return y


print(fn2(fn(1)))
函数可以作为容器的元素
list1 = [1, 2, 3, fn]
list1[3]()    # 实质就是调用了fn函数
匿名函数(lambda)

匿名函数没有名字的函数

语法格式

lambda 参数列表:运算表达式
lambda x:x*x

f = lambda x:x*x
print(f(5))
  • lambda并不会带来程序效率提高
  • lambda内不要循环,有的话用标准函数
  • lambda只是为了减少单行函数的定义而存在
高阶函数

把函数作为参数,返回值传入

def ab_sum(a, b, f):
    return f(a) + f(b)


print(ab_sum(-1, -2, abs))
内置高阶函数
map(func, seq)    # 将传入的函数func作用到序列变量seq的每一个元素中,将结果作为新的迭代器返回

list_demo = [1, 2, 3, 4, 5]

print(list(map(lambda x:x+1, list_demo)))
reduce(func,seq)    # func必须有两个参数,将每次调用func的返回值作为下一次调用func的一个参数,然后与序列seq的下一个元素继续运算,以此类推,返回结果为一个单值,结果可以直接使用

reduce 在 functools 包中,使用时需要导包

filter(func, seq)    # 过滤序列seq,过滤掉不符合的元素,func需要返回bool值,若结果为True,就会保留seq中的元素
递归函数

递归 函数内调用函数自身

python对递归次数有自己的限制,不会无限递归下去

编写递归函数步骤
  1. 首先定义一个出口

  2. 算法不断接近出口

闭包与装饰器 闭包

闭包 如果在一个内部函数,对在外部作用域(非全局变量)的一个变量进行引用,那么内部函数就被认为闭包

def f():
    x = 10
    def g():    # g()被封闭起来且使用了外部作用域的x,这种操作称为闭包
        print(x)
        
    return g

h = f()
h()    # g()
装饰器 无参
time 时间模块
import time
time.time()    # 拿到此时此刻的时间
  • 封闭原则:不允许修改内容
  • 开放原则:允许对原内容进行扩展

下面show_time就是一个装饰器,可以在不改变原函数的情况下(封闭原则)扩展功能,一般将常用的功能做成装饰器,方便使用

import time

def foo():
    print("foo")

    
def show_time(func):
    def inner():
        start = time.time()
        func()
        end = time.time()
        print(f"运行了{end-start}秒")
    return inner


foo = show_time(foo)     
import time

    
def show_time(func):
    def inner():
        start = time.time()
        func()
        end = time.time()
        print(f"运行了{end-start}秒")
    return inner

@show_time
def foo():
    print("foo")    

上面两段代码功能一样,都是给原函数foo扩展计时功能

有参
import time


def show_time(func):
    def inner(*args,**kwargs):    # 传入多个参数并装包
        start = time.time()
        res = func(*args,**kwargs)    # 将装包的参数解包,依次传入func
        end = time.time()
        print(f"执行时间为{end-start}")

        return res

    return inner


@show_time    # add = show_time(add)
def add(x, y):
    return x + y


print(add(3, 4))
生成器与迭代器

生成器 生成器不占用内存空间,只有使用时才会取相关的值,因此有节省内存的优点。生成器是可迭代对象

两种语法

g = (i for i in range(100000))    #并不会直接存储,只有在使用时才会取值
g.__next__()    # 取g的第一个数    __next__为内部特殊方法,使用时并不建议使用可以使用next(g)
yield # 声明一个生成器

def f():
    yield 1
    
    
g = f()
print(next(g))

迭代器生成器就是迭代器

什么是迭代器

  1. 有next方法
  2. 有iter方法
模块与包

定义 包含一些数据、函数、类的文件,通常以.py结尾

模块之间的联系 模块导入

方法一:

# 将某模块整体导入到当前模块中
import 模块名    # 导入模块,直接执行模块中的全局作用域中的内容,优先搜索当前目录
模块名.成员    # 使用模块中的成员

通过模块名关联模块的地址


方法二:

from 模块名 import 成员    # 从模块中导入成员,可以直接使用成员

将指定模块的成员导入到当前模块


方法三:

from 模块名 import *    # 导入模块中的所有内容,最好在熟悉模块内容的情况下使用

将指定模块的所有成员导入当前模块

导入的成员不要与当前模块中的成员重名,若重名,则就近选择当前模块的成员

as 别名
# 避免不同模块中有相同成员
from 模块名 import 成员 as 别名
隐藏成员

定义模块中以下划线(_)开头的属性不会被方法三导入,通常称这些成员为隐藏成员(但可以通过其他方法导入)

# 示例
# module01.py
def func():
    print("func in module01")


def _func():	# 隐藏成员_func
    print("_func in module01")

# demo.py
from module01 import *

func()
_func()    # 无法找到

运行结果:

模块变量
__file__    # 模块对应的文件路径名

__name__    # 模块自身的名字,可以判断是否时主模块
# 主模块__name__绑定为'__main__'

python中__main__ :

  1. 如果一个.py文件作为主程序来运行时,那么__name__的值为__main__,如果为模块那么为__模块名__
  2. 把一些非必要代码放入main函数内
if __name__ == '__main__':
    pass
分类
# 内置模块:在解析器内部可以直接使用
# 标准库模块:安装python时已经安装的模块,可以直接安装
# 第三方模块:通常时开源的,需要自己安装并学习使用
# 用户自己编写的模块

第三方模块安装方法

  1. 通过在终端运行pip install 模块名 -i 源地址

    国内源地址

    1)清化大学
    PIP源地址:https://pypi.tuna.tsinghua.edu.cn/simple
    2)阿里云
    PIP源地址:http://mirrors.aliyun.com/pypi/simple/
    3)豆瓣
    PIP源地址:http://pypi.douban.com/simple/
    4)中国科学技术大学
    PIP源地址:http://pypi.mirrors.ustc.edu.cn/simple/
    5)华中科技大学
    PIP源地址:http://pypi.hustunique.com/

  2. 在pycharm找到选项安装

包

python大致结构

包    # 文件夹
	模块    # 文件
    	函数
        	语句

包 将模块以文件夹的形式进行分组管理,管理模块。将相关的模块组织在一起,使逻辑结果更加清晰。python包里默认有__init__模块

包的导入
from 包.模块 import 成员    # 类似模块导入,另两种方法相似,但大多数选择这种形式
__init__.py
__init__.py    # 包内必须存放的文件,会在包加载时被自动调用

通常存放关于包内模块的使用说明

常用模块 sys

system:系统的意思。提供一些变量和函数,可以获取到Python解析器的信息

pprint:标准库模块,pprint()可以简单的美化数据打印

sys.modules    # 获取当前程序中引入的所有模块

sys.path    # 返回一个列表,列表中保存的是模块的搜索路径

sys.exit()    # 用来退出程序,括号内可以小写提示字符串
os
# 对操作系统进行访问


os.system()  # 用来执行操作系统的命令
	os.system('pip install jieba')
    
os.getcwd()    # 获取当前python工作目录

os.mkdir('文件夹名')    # 当前目录创建一个文件夹

os.rmdir('文件夹名')    # 删除当前目录下的文件夹(只能删空的)

os.rename('旧文件名','新文件名')    # 重命名

os.chdir('文件夹名')    # 切换当前执行程序的位置

os.listdir()    # 获取指定目录下所有文件和目录名
    
os.path  # 判断是否是文件夹和文件

os.path.exists(path) # 判断文件或者目录是否存在

os.path.isfile(path) # 判断是否为文件

os.path.isdir(path)  # 判断是否为文件夹
time
import time

time.time()    # 时间戳,返回utc时间,从1970年开始到现在经过的秒数

time.localtime()    # 返回一个时间元组,可以单独拿到属性

time.sleep()    # 程序休眠,单位为s

time.strftime()    # 配合localtime格式化获取时间
	# %Y 年
    # %m 月
    # %d 日
    # %H 时
    # %M 分
    # %S 秒
    t = time.localtime()
    print(time.strftime('%Y %m %d'))
random
import random

random.random()    # 生成大于0小于1的随机数

random.randint(start, end)    # 生成start~end随机整数

random.choice(序列)    # 随机生成指定的元素

random.uniform(start, end)    # 生成start~end随机小数

random.shuffle(序列)    # ”洗牌“打乱一个序列
json

前端 用户直接看到的

后端 接收前端请求,做该做的数据处理

json 一种文件的存储格式,主要用于存储,大部分的编程语言都可以识别,是一种兼容性很强的文件格式,网络中大部分数据都是以json形式传递让每个语言都可以访问

序列化数据 机器码(二进制)

反序列化数据 代码

import json

json.dumps(序列)    # 将序列内容序列化存储(按照json方式存储)

json.loads(序列化内容)    # 反序列化
文件

绝对路径 从根目录开始,文件的完整路径,具有唯一性

D:Python【学习】python自学python函数方法自总结

相对路径 以当前文件资源所在的目录为参照基础,链接到目标文件资源

__file__    # 获得当前文件的路径
创建文件
 
打开文件 
f = open(file, mode='r', buffering=-1, encoding=None, )    # python内置函数,打开文件,默认为只读(r),编码为None, 

# 目标文件与.py文件在同级目录下file直接使用文件名称,不在同一目录下使用绝对路径

mode默认为只读

r read 只读

w write 写入 # 会覆盖源文件内容,如果文件不存在会创建文件

a add 追加 # 如果文件不存在会创建文件

+ 为操作符增加功能:

r+ # 可写也可读,文件不存在会报错

w+ #可写也可读,文件不存在会报错

a+ # 可写也可读,文件不存在会报错

关闭文件
f.close()    # 关闭文件

with open(fileName) as f:    # 使用该语法只会在改语法的内部保持文件打开的状态
    pass
f.read()    # 已经被自动关闭,执行后会报错
读取文件
f.read()    # 默认读取文本文件,文件内所有内容以字符串格式返回,可以指定访问字符数量,单位为字符不是字节。

# 若要读取二进制文件,需要把mode改为rb,类似的,二进制文件都需要加一个b
# 读取大文件的方式
with open(fileName, encoding='utf-8') as f:
    all_content = ''
    while True:
        content = f.read(3)
        if content == '':
            break
print(all_content)            
f.readlines()    # 按行来读取
写入文件
write open(fileName, mode='w',endcoding='utf-8') as f:
    f.write('Hello world')    # 返回值为写入的字符串长度
    f.read()
正则表达式

正则表达式:普通字符和元字符构成的字符串,描述一类字符串规则

需要导入re模块

习惯性使用原始字符串(r字符串)

import re

re.match(参数一, 参数二)    # 在参数二中从左往右匹配参数一的内容,匹配不到返回None
re.match().group()    # 可以直接返回匹配内容
re.findall()    # 返回一个列表,与match参数一样
元字符

.:任意字符,‘n’除外,若在match中匹配到’n’,会返回None

re.match('.', "web")    # 匹配成功,结果为w

d:0~9的任意数字

re.match('d', '0web')    # 匹配成功,结果为0

D:非数字

re.match('D', '123')    # 匹配失败,1为数字

s:空白字符

re.match('s', 'n')    # 匹配成功,换行空格等都是空白字符

S:非空白字符

re.match('S', '\')    # 匹配成功,值为'\',第一个''为转义字符

w:英文字母,数字,下划线

re.match('w', '5sd_')    # 匹配成功,值为5

W:非英文字母,数字,下划线

re.match('W', '&*^')    # 匹配成功,值为&
字符集

使用[],表示一个字符的范围

re.match('[0-9][0-9]', '11')    # 匹配成功,取两位数,值为11
re.match('[a-d]', 'abcz')    # 匹配成功,值为a,'[a-d]'表示abcd,'[A-z]'为所有字母等等

^:取反符号

re.match('[^a-e]', 'f')    # 匹配成功,值为f。'^'加在前面表示取反,即匹配内容为a-e之外的字符
数量规则

*:匹配前一个字符的任意次数的字符,包括0次

t = '10086'
re.match('d*', t)    # 匹配所有的数字,值为'10086'

+:匹配前一个字符重复一次以上的任意次数

import re
demo = ''

res_t = re.match('w*', demo)
print(res_t)    # 结果为正常的空字符

res_a = re.match('w+', demo)
print(res_a)    # 结果为None
'''
d+:
	d
	dd
	ddd
	...
d*:
	''
	d
	dd
	ddd
	...
'''

?:匹配前一个字符出现0次或者1次

t = '10086'
d = ''
re.match('d?', t)    # 1
re.match('w?', d)    # ''

+++

{m}    # 匹配前一个字符的m次
{m,}    # 至少匹配前一个字符m次以上
{m,n}    # 匹配m次以上,n次以下
t = '10086'
re.match('d{2,}', t)    # 结果为'10086' 
边界处理

^:开始(只有在字符集中才是取反)

$:结束

# 学号格式201610916121前六位必须201610,共12位
n = '201610916121'
n.match('^201610d{6}$', n)    # 必须从2开始,然后后面必须满足12位学号
分组匹配
t = '2022-06-15'
print(re.match('d{4}-0[1-9]-d{2}', t))    # 月份只有01~09,没有10~12

|:正则表达式中的或者

():正则表达式中的分组

t = '2022-06-15'
print(re.match('d{4}-(0[1-9]|1[0-2])-d{2}', t))    # 可以正确匹配日期格式
re.match('d{4}-(0[1-9]|1[0-2])-d{2}', t).group()    # 返回分组内容'06'

re.match('(d{4})-(0[1-9]|1[0-2])-(d{2})', t).group()    # 返回分组内容,有三对括号,所以有三个分组,group后的参数为返回分组的数量
import re

xml = 'hello'
res = re.match('(.*)', xml)
# res = re.match('<(w+)>(.*)', xml)
# 1 与第一个分组的内容相同 1 == w+
print(res)    # 取到'hello'
print(res.group())    # 取到'hello'

分组取别名:(?P<别名>) (?P = 别名)

MVC开发模式

包:分类,管理模块

MVC:架构分明,分工合作完成。方便开发,维护和更新。

  • M:(model)模块层,对数据进行增删改查,一般处理sql数据
  • V:(view)视图层,用于数据的显示媒介为html或者json
  • C:(controller)控制层,用户的交互,控制行为
ATM项目 项目环境搭建
  1. 准备计划,分析项目逻辑,细节

  2. 新建文件夹

  3. 建立架构

api    # Application Programming Interface 应用程序编程接口,专门处理业务逻辑相关操作
	user_interface.py
    bank_interface.py
config    # 配置(数据库的账号密码,python版本等)
	setting.py
core    # 核心文件,代码主要功能实现
	src.py    # source源代码
db    # database 数据库
	user_data    # 用户的数据
    db_handle.py    # 数据库处理
lib    # library 常用功能模块
	common.py    # 常见功能模块
readme.txt    # 说明文档
run.py    # 运行,主模块
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1001990.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号