Python 学习笔记

Python 学习笔记

1、Python脚本

1.1脚本.py

hello.py

#code:utf-8 #  以下空一行

import os #  以下空两行


print(os.getcwd())
print('欢迎大家')
print('来到python世界')`#  最后也要空一行

虽然空行对程序的运行没有影响,但是好的编程习惯还是要有的。

执行脚本指令:

python hello.py

python是指Python编译器

1.2 头注释-#

非必须,但是要了解

#  coding:utf-8

1.3导入-import

导入是将Python的一些功能函数放到当前的脚本中使用。

import os

1.4代码中的注释

三种注释

# 这里是注释(#之后有两个空格)

“”“
可以多行注释
”“”

‘’‘
跟双引号一样,多行注释
’‘’

1.5脚本入口main

__name__ =='__main__'

__name__指代本脚本的名字

1.6 变量名

a.由英文字母数字和下划线组成

b.不能由数字开头,可以由下划线开头

c.变量名要有实际意义

1.7Python中的关键字

强关键字(不能使用来作为变量使用)

弱关键字(某些不冲突的情况下可以使用作为变量等使用)

  • 强关键字:除了常见的if、else、false、true等与其他语言一样的关键字,还有如下表(部分)
关键字 含义
def 定义函数
is 判断变量是否市某个类的实例
not 逻辑运算,非
or 逻辑运算,或
pass 无意义,站位字符,什么都不做
raise 主动抛出异常
in 判断变量是否在序列中
with 简化Python语句
yield 从循环或函数依次返回数据
import 导入语句

2、Python数据类型

2.1数据类型

数据类型
数字类型 numbers
字符串类型 string
布尔类型 bool
空类型 None
列表类型 list
元组类型tuple
字典类型dict
2.1.1数字类型
  • 整型 int
  • 浮点型 float
  • 内置函数 type : 返回变量的类型
count_100_01 = int(100)
count_100_01 = 100

注:Python2中曾经有long整型,在Python3之后就废弃了

pi_01 = float(3.14)
pi_02 = 3.14
print(type(pi_02))
2.1.2字符串类型

字符串的重要思想:字符串不可改变

重要的内置函数:

  • id:返回变量的内存地址 id(变量)
  • len:返回字符串的长度 len(字符串)
  • in:判断成员内是否含有某个元素
  • max:返回数据中最大的成员 max(数据)
  • min: 返回数据中最小的成员 min(数据)

重要的知识点:

先看代码

str_01 = '这是str1'
str_02 = '这是str2'
str_03 = str_01
print(id(str_01))
print(id(str_03))
str_04 = 'this is a "string" test'
str_05 = “this is a 'string' test”
  • str_03和str_01的内存地址是一样的,所以可以看出,行3的赋值代码并不是重新开了一个内存,而是引用了str_01的内存,指向同一内存,所以如果修改str_01的值,str_03的值也会变。
  • 如果字符串中有引号,则在字符串中使用与外侧不同的引号,str_04和str_05的字符串能正常输出。
2.1.3布尔类型和空类型
  • 真true
  • 假false
  • 空类型:不属于任何数据类型

空类型:固定值None

2.1.4列表类型list

列表就是队列,是各种数据类型的集合,也是一种数据结构。在Python中,列表是一个无限制长度的数据结构。

列表定义:

  • 使用list()
names_01 = list(['hongyun', '小雪', 'hongyun', 'Howardy'])
  • 使用[]
names_02 = ['hongyun', 12, None, 'Howardy']

知识点:

none_list = [None, None, None]

这里的none_list长度为3,而不是0,只有这样none_list = []才是0。

2.1.5元组类型

元组与列表一样,都是一种可以储存多种数据结构的队列,也是有序,且元素可以重复的集合。

定义元组:

  • 使用tuple()
name_01 = tuple(('hongyun', '中文'))
  • 使用()
name_02 = ('hongyun', '中文')
name_03 = ('hongyun', )    # 如果只有一个元素,需要在后面加一个逗号

注:如果只有一个元素,不在后加逗号,那么这个元组就不是元组了,而是与该元素的类型一致。比如上面name_03的元素为字符串,那么id(name_03)也返回的是字符串,而不是元组。

列表与元组的区别:

  • 元组比列表占用资源更小;
  • 列表是可变的,元组是不可变的。
none_tuple = (None, None, None) # 空类型元组
tuple_tuple = ((1, 2, 3), (4, 5, 6)) # 元组中的元素也是元组
list_tuple = ([1, 2, 3], [2, 3, 4]) # 列表作为元素
mix_tuple = ('hong', 2, 3.14, None, False) # 多数据类型元组
2.1.6字典类型

字典是由多个键(key)及其对应的值(value)所组成的一种数据类型。

创建字典:

使用dict()创建,{}中存入内容

a = dict()
a = {'name': 'hongyun', 'age': 22}

知识点:

  • key支持字符串,数字和元组类型,不支持列表
  • value支持所有的Python数据类型
  • 字典中的每一个key都是唯一的

Python3.7与之前版本字典的区别:

3.7之前的版本的字典是无序的,之后是有序的。

2.2 运算

2.2.1赋值运算

除了常规的运算之外,还有如下运算:

运算符 描述 使用
% 取模运算符 c %=a
** 幂运算符 c **=a -->c=c **a
// 整除运算符 c //= a

字符串与数字的乘法:

字符串无法与字符串相乘,字符串只可以和数字做乘法。

name = 'hy'
print(name*3)

'hyhyhy'

同理,列表和元组可以与数字相乘,但不能跟字典相乘。需要注意的是,列表和元组与数字相乘之后得到的是新的列表和元组。

2.2.2比较运算符

除了常规的比较运算符,还有如下的身份运算符:

运算符 描述 使用
is 判断两个对象存储单元是否相同 a is b
is not 判断两个对象存储单元是否不同 a is not b

3、字符串

3.1 字符串的内部函数

3.1.1 capitalize()

功能:将字符串的首字母大写,其他字母小写

使用方法:newstr = str.capitalize()

注意事项:

  • 只对第一个字母有效
  • 只对字母有效
3.1.2 lower()和upper()

功能:lower()是将字符串中的大写字母变成小写字母,upper()则是反过来。

与lower()功能相同的函数还有casefold(),casefold()是Python3.3才引入的,能适应更多语种的大小写转化,比如德语字母。

newstr = str.lower()

newstr = str.upper()

3.1.3 swapcase()

功能:将字符串中的小写字母转换成大写字母,大写字母转换成小写字母。

newstr = str.swapcase()

3.1.4 zfill()

功能:为字符串定义长度,如果不满足,缺少的部分使用0填充,0补充在字符串前

使用方法:

new = str.zfill(width) # 参数width:新字符串的宽度

3.1.5 count()

功能:返回当前字符串中某个成员(元素)的个数,如果不存在,则返回0。

用法:int_type = string.count(item) # item:需要查询的元素

3.1.6 starswith()和endswith()

功能:分别判断字符串开始和结尾是否是某成员(元素)

使用:

string.startswith(item) # item:需要查询的元素,返回布尔值

string.endswith(item) # item:需要查询的元素,返回布尔值

3.1.7 find()和index()

功能:两者都是返回想要寻找成员的位置

使用:

string.find(item) # item:想要查询的元素,函数返回一个整型

string.index(item) # item:想要查询的元素,函数返回一个整型或者报错

注意事项:

  • 如果find找不到元素,会返回-1;
  • 如果index找不到元素,会导致程序报错
3.1.8 strip()

功能:去掉字符串左右两边的指定元素,默认是空格

使用:

newstr = string.strip(item) # item可填可不填,不填默认为空格

注:

传入的元素如果不在开头或则结尾则无效

lstrip 仅去掉字符串开头的指定元素或空格

rstrip 仅去掉字符串结尾的指定元素或空格

3.1.9 replace()

功能:将字符串中的old(旧元素)替换成new(新元素),并指定替换的数量

使用:

newstr = string.replace(old, new, max)

参数:

old:被替换的元素

new:替代old的新元素

max:可选参数,表示替换几个,默认全部全部替换匹配的元素

3.1.10 字符串中返回bool的函数集合
函数名 功能
isspace 判断字符串是否是一个由空格组成的字符串
istitle 判断字符串是否是一个标题类型(即字符串是英文字母,且每个单词首字母大写)
isupper 判断字符串中的字母是否都是大写
islower 判断字符串中的字母是否都是小写
join
split

3.2 字符串其他操作

3.2.1 字符的编码格式

编码格式:编码是用预先规定的方法将文字、数字、其他特殊字符等编成数码,或将信息、数据转换成规定的脉冲信号。

常见的标准化编码格式:

  • GBK中文编码
  • ASCII英文编码
  • utf-8 一种国际通用的编码格式
3.2.2 字符串的格式化

格式化:一个固定的字符串中有部分元素是根据变量的值而改变的。

根据类型定义的格式化:

  • 字符串格式化使用操作符%来实现
'my name is %s, my age is %s' % ('hongy', 22)

%s 是python的通用格式化类型

  • 使用{}代替格式符
str1 = 'my name is {}, my age is {}'
print(str1.format('hongy', 22))
  • python3.6加入新的格式化方法——f-strings

    str2 = f 'my name is {name_01}, my age is {age_01}'
    

    {}内必须是变量,比如直接写'hongy'是不可行的

符号 说明
%s 格式化字符串,通用类型
%d 格式化整型
%f 格式化浮点型
%u 格式化无符号整型
%c 格式化字符
%o 格式化无符号八进制数
%x 格式化无符号16进制数
%e 科学计数法格式化浮点数
3.2.3 转义字符
符号 说明
\n 换行,一般用于末尾,strip对其他有效
\t 横向制表符
\v 纵向制表符
\a 响铃
\b 退格符,将光标前移,覆盖(删除前一个)
\r 回车
\f 翻页
\' 转义字符的单引号
\" 转义字符的双引号
\\ 转义斜杠

4、Python列表

4.1 列表常用方法

4.1.1 append()

功能:将一个元素添加到当前列表中

使用:list.append(new_item)

注意事项:

  • 被添加元素只会被添加到末尾
  • append函数是在原有列表的基础上添加,不需要额外添加新的变量
  • append只能添加一个元素
4.1.2 insert()

功能:将一个元素添加到当前列表指定的位置。

使用:

list.insert(index, new_item)   # index:添加的位置 new_item:添加的新元素

注意事项:

  • 如果insert传入的位置在列表中不存在,则将新元素添加到列表的末尾
4.1.3 列表/元组的count()

功能:返回列表/元组的需要查询元素的个数,列表和元组使用完全一样。

使用:

inttype = list.count(item)

inttype =tuple.count(item)

注意事项:

  • 如果查询的成员不在,则返回0
4.1.4 remove()与del

功能:删除列表中的某个元素

使用:list.remove(item)

注意事项:

  • 如果删除的成员(元素)不存在,则会直接报错
  • 如果删除的元素有多个,只会删除第一个
  • 不会返回一个新的列表,而是在原来的列表中对元素进行删除

del:直接把变量完全删除

del的使用

drinks = ['雪碧', '可乐', '王老吉']
del drinks
print(drinks)      # 运行后报错,name 'drinks' is not defined
4.1.5 reverse()

功能:对当前列表顺序进行翻转

使用:list.reverse()

4.1.6 sort()

功能:对当前列表按一定的规律排序

使用:list.sort(key = None, reverse = False)

参数:key - 参数比较

​ reverse -- 排序规则,True为降序,False为升序(默认)

注意事项:

  • 列表中的元素类型必须形同,否则无法排序(报错)
4.1.7 clear()

功能:将当前列表中的数据清空

使用:list.clear()

4.1.8 copy()以及深浅拷贝

功能:将当前列表复制得到一份新的列表,新列表与旧列表内容相同,但内存空间不一样(即地址不一样)

使用:list.copy()

浅拷贝:有一个列表a,其里面的元素还是列表,当我们拷贝出新列表b后,无论a还是b的内部的列表中的数据发生变化之后,相互之间会受到影响

copy()属于浅拷贝

比如:

a = [[1, 2, 3], [4, 5, 6]]
b = a.copy()
b[0].append(10)
print(b)  # [[1, 2, 3, 10], [4, 5, 6]]
print(a)  #[[1, 2, 3, 10], [4, 5, 6]]

注:list深层次的数据还是会相互影响的,只在第一层数据之间不影响

深拷贝:不仅是第一层数据进行了copy,对深层次的数据也进行了copy,原始变量和新变量完完全全不共享数据

a = [[1, 2, 3], [4, 5, 6]]
b = copy.deepcopy(a)
b[0].append(10)
print(b)  # [[1, 2, 3, 10], [4, 5, 6]]
print(a)  #[[1, 2, 3], [4, 5, 6]]
4.1.9 extend()

功能:将其他列表/元组中的元素导入到当前列表中

使用:list.extend(iterable) # 参数iterable代表列表/元组,该函数无返回值

stu = ['小明', '小雪', '小红']
new_stu = ['老高', '小潘']
stu.extend(new_stu)
print(stu)    # ['小明', '小雪', '小红', '老高', '小潘']

4.2 索引与切片

索引从最左边开始记录的位置,用数字表示,起始从0开始。超出索引范围,会报错。

索引用来对单个元素进行访问,而切片则是对一定范围内的元素进行访问。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(numbers[3:8]) # [4, 5, 6, 7, 8]
print(numbers[:])  # 完整列表
print(numbers[0,:])  # 完整列表
print(numbers[::-1]) # 反序
print(numbers[0:8:2]) # 指定步长 [1, 3, 5, 7]
print(numbers[0:0])  # 切片生成空列表

切片规则:左含,右不含。所以上面例子1不打印9。

  • index():
list.index(item)  # 返回item所在的索引值,如果没有该元素则报错
  • pop():通过索引删除并获取列表的元素
list.pop(index)   # 删除列表index索引位置的元素,并将元素值返回,如果不存在index索引则报错
  • del:删除索引位置的元素
del list[index]  # 直接删除,没有返回值

注意事项:

  • 元组可以和列表一样获取索引与切片
  • 元组函数index和列表使用完全一样
  • 无法通过索引修改、删除元素
4.2.1 字符串索引
name = 'hongyun'
print(name[0])  # h
print(name[:2])  # ho

注:

  • 切片和索引获取的内容方式与列表相同
  • 无法通过索引修改与删除内容
  • 字符串可不修改
4.2.2 字符串的find与index函数

功能:都是获取元素的位置

使用:

string.index(item) # item查询的元素,返回索引位置

string.find(item) # item查询的元素,返回索引位置

info = 'my name is hongyun'
print(info.index('hongyun')) # 11
print(info.find('hongyun')) # 11

find与index的区别:

  • find如果获取不到,返回-1
  • index如果获取不到,直接报错

4.3 字典

4.3.1 字典常用方法

[]处理方法

  • 字典没有索引
  • 通过键key来获取相应的值
  • 是 添加 还是 修改,由key是否存在决定

update函数:

用法:dict.update(new_dict) # 无返回值,new_dict是一个新字典

注:若dict中有new_dict中的key,则修改对应的值,如没有,则添加相应的键值。

user = {'username': 'hongyun', 'age': 23}
yuchen = {'username': 'yuchen', 'age': 22, 'high': 175}
user.update(yuchen)
print(user)  #  {'username': 'yuchen', 'age': 22, 'high': 175}

setdefault函数:

用法:dict.setdefault(key, value)

参数: key-需要获取的key

​ value-如果key不存在,对应key存入字典的默认值

4.3.2 字典的keys函数

功能:获取当前字典中所有的键key

使用:dict.keys() # 无参数,返回一个key集合的伪列表

伪列表:看似列表,但不具备列表功能

my_dict = {'name': 'hongyun', 'age': 23}
my_dict.keys()  #伪列表dict_keys(['name', 'age'])
key_list = list(my_dict.keys())  #列表['name', 'age']
4.3.3 字典的values函数

功能:获取当前字典中所有键值对中的值(value)

使用:dict.values() # 无参数,返回一个value集合的伪列表

4.3.4 字典获取key对应的value

两种方法获取key对应的value:

my_dict = {'name': 'hongyun', 'age': 23}
age = my_dict['age']      # 23  方法一  []
age = my_dict.get('age')  # 23  方法二   get

[]与get的区别:

  • []如果获取key是不存在的,则直接报错
  • get如果获取key是不存在的,则返回默认值

所以在开发中,优先使用get函数。

4.3.5 字典的删除
  • clear函数:

dict.clear() # 无参数,无返回值。对dict进行清空,删除所有键值对

  • pop函数:

dict.pop(key) # key:希望被删除的键, 函数返回key对应的value

  • del:
my_dict = {'name': 'hongyun', 'age': 23}
del my_dict['name']    #删除my_dict字典中的name
del my_dict    # 直接删除my_dict字典
4.3.6 copy

使用:

dict.copy() # 无参数,返回一个一样的字典,但是内存地址不同

4.3.7 popitem

功能:删除当前字典里末尾一组键值对并将其返回

使用:dict.popitem() # 无参数

说明:函数删除最后一组键值对,并返回,返回值用元组包裹,索引0是key,索引1是value

注意事项:

如果字典为空,则直接报错

4.4 集合

什么是集合:

  • 集合是一个无序的不重复的元素序列
  • 常用来对两个列表进行交并差的处理
  • 集合和列表一样支持所有数据类型

集合与列表的区别:

功能 列表 集合
顺序 有序 无序
内容 可重复 不可重复
功能 用于数据的使用 用于数据的交集并集差集的获取
索引 可索引 无索引
符号 [] [1, 2, 3] { }

集合的创建:使用set函数来创建集合,不能使用{}来创建空集合

a_set = set()    # 空集合
b_set = set([1,2,3])   # 传入列表或者元组
c_set = set{1, 2, 3}    # 传入元素
d_set = {}   #错误的方法,得到的不是空集合,而是空字典
4.4.1 集合的增删改
  • add函数

set.add(item) # item:要添加到集合中的元素,无返回值

注意:如果item已经存在set中了,则add无效,因为集合元素是不可重复的

  • update函数

功能:加入一个新的集合(或列表、元组、字符串),如新集合内的元素在原集合中存在则无视

使用:

set.update(iterable) # iterable:集合、列表元组或字符串 ,无返回值,直接作用于原集合

  • remove函数

set.remove(item) # item:当前集合中的一个元素,无返回值,作用于原集合

  • clear函数

功能:清空当前集合的所有元素

使用:

set.clear() # 无参数,无返回值,直接作用于原集合

  • del函数
a_set = {1, 2, 3}
del a_set      # 直接删除集合a_set,内存中也不再有a_set,所以print(a_set)会报错

集合的重要说明:

  • 集合无法通过索引获取元素
  • 集合无获取元素的方法
  • 集合只是用来处理列表或元组的一种临时类型,不适合存储与传输
4.4.2 集合的差集

difference函数

功能:返回集合的差集,即返回的集合元素在第一个集合中,但不包含在第二个集合(方法参数)中。

使用:

a_set.difference(b_set) #b_set:当前集合需要对比的集合,返回两个集合的差集

4.4.3 集合的交集

intersection函数

功能:返回两个或多个集合中都包含的元素,即交集

使用:

a_set.intersection(b_set...) #b_set...:与当前集合对比的1个或多个集合

返回值:返回原始集合与对比集合的交集

4.4.4 集合的并集

union函数

使用:

a_set.union(b_set...) # b_set...:与当前集合对比的1个或多个集合

返回值:返回原始集合与对比集合的并集

4.4.5 判断两个集合中是否有相同的元素

isdisjoin函数

功能:判断两个集合是否包含相同的元素,如果没有返回True,否则返回False。

使用:

a_set.isdisjoin(b_set) # 如果没有相同元素返回True,否则返回False

4.5 Pyhon不同数据类型之间的转换

4.5.1 字符串与数字之间的转换
原始类型 目标类型 函数 举例
整型 字符串 str new_str = str(1234)
浮点型 字符串 str new_str = str(3.14159)
字符串 整型 int new_int = int('12')
字符串 浮点型 float new_float = float('1.234')

注意事项:

  • 字符串 -> 数字 要求字符串中除小数点外必须只包含数字,不包含其他字符
4.5.2 字符串与列表之间的转换

split函数

功能:将字符串以一定规则切割成列表

使用:

string.split(seq = None, maxsplit = -1)

参数: seq -> 切割的规则符号,不填写,默认为空格,如果字符串没有空格,则不分割成列表

注意:seq不能传空字符

​ maxsplit -> 根据切割符号切割的次数,默认-1无限制

返回值:返回一个列表

info = 'my name is hongyun'
info_list = info.split()
print(info_list)    # ['my', 'name', 'is', 'hongyun']

join函数

功能:将列表以一定的规则转换成字符串

使用:

'seq'.join(iterable)

参数:seq -> 生成字符串用来分割列表每个元素的符号

​ iterable -> 非数字类型的列表或元组或集合

返回值:返回一个字符串

test_list = ['a', 'b', 'c']
new_str = '.'.join(test_list)
print(new_str)   # 'a.b.c'
test2_list = [1, 2, 3]
print('|'.join(test2_list))    # 编译器报错,因为list元素如果是数字,不能进行转换

报错:TypeError: sequence item 0: expected str instance, int found

Python内置函数---sorted() 对任意类型进行排序

sort_str = 'abdfigej'
res = sorted(sort_str)
print(''.join(res))  # abdefgij
4.5.3 字符串与bytes通过编解码进行转换

比特类型:

  • 二进制的数据流---bytes
  • 一种特殊的字符串
  • 字符串前+b标记
bt = b'my name is hongyun'
print(type(bt))   # <class 'bytes'>
print(bt.capitalize())  # b'My name is hongyun'
print(bt.replace(b'hongyun', b'Howardy')) # b'my name is Howardy'
print(bt[0]) # 109
print(bt[:2]) # b'my'
print(bt.find(b'n')) # 3
print(dir(bt)) # 打印bytes类型所有的属性和内置函数
# ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'center', 'count', 'decode', 'endswith', 'expandtabs', 'find', 'fromhex', 'hex', 'index', 'isalnum', 'isalpha', 'isascii', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
chinese_str = b'hello 小雪'
print(chinese_str) # 报错,只能包含ASCII,不能包含中文
# SyntaxError: bytes can only contain ASCII literal characters.

字符串转bytes的函数---encode 编码

使用:

string.encode(encoding = 'utf-8', errors = 'strict')

参数:encoding -> 转换成的编码格式,如ascii,gbk 默认为utf-8

​ errors -> 出错时的处理方法,默认strict,直接抛出错误,也可以选择ignore忽略错误

返回值:返回一个bytes类型

str_data = 'my name is 荷叶'
byte_data = str_data.encode('utf-8')
print(byte_data)  # b'my name is \xe8\x8d\xb7\xe5\x8f\xb6'

bytes转字符串的函数---decode 解码

使用:

string.decode(encoding = 'utf-8', errors = 'strict')

参数:encoding -> 转换成的编码格式,如ascii,gbk 默认为utf-8

​ errors -> 出错时的处理方法,默认strict,直接抛出错误,也可以选择ignore忽略错误

返回值:返回一个字符串类型

str_data = 'my name is 荷叶'
byte_data = str_data.encode('utf-8')
print(byte_data)  # b'my name is \xe8\x8d\xb7\xe5\x8f\xb6'
print(byte_data.decode('utf-8')) # 'my name is 荷叶'
4.5.4 列表、集合、元组的转换
原始类型 目标类型 函数 举例
列表 集合 set new_set = set([1, 2, 3, 4])
列表 元组 tuple new_tuple = tuple([1, 2, 3])
元组 集合 set new_set = set((1, 2, 3))
元组 列表 list new_list = list((1, 2, 3))
集合 列表 list new_list = list({1, 2, 3})
集合 元组 tuple new_tuple = tuple({1, 2, 3})

5、Python流程控制

5.1 条件

用法:

if bool_result:  
    do something
elif bool_result:
    do something
else:
	do otherthing    

5.2 for循环

用法:

for item in iterable:
    do something(item) 
list_tem = ['lihua', 'wanger', 'lisi', 'zhangsan']
for item in list_tem:
    print(item)

字典利用items函数进行for循环

功能:将字典转换成伪列表,每个key,value转成元组

使用:

for key, value in dict.items():
    print(key, value)
users = {'name': 'hongyun', 'age': 24}
items = users.items()
print(items)  # dict_items([('name', 'hongyun'), ('age', 24)])
for key, value in items:
    print(key, value)
'''
name hongyun
age 24
'''

Python的内置函数---range

功能:返回的是一个一定范围内的可迭代对象,元素为整型,他不是列表,无法打印信息,但可循环

使用:

for item in range(start, stop, step = 1):
    print(item)

参数:start -> 开始的数字,类似索引的左边

​ stop -> 结束的数字,类似索引的右边

​ step -> 跳步,类似索引中的第三个参数

else在for循环中的使用

l = range(5)
for item in l:
    print(item)
else:
    print('循环结束')
'''
0
1
2
3
4
循环结束
'''

5.3 while循环

用法:

while bool_result:
    do something

6、函数

6.1 函数的定义与使用

内置函数

自定义函数

6.1.1 函数的定义
def name(args...):
    do something
    返回值
6.1.2 函数参数
  • 必传参数:

在定义函数的时候,没有默认且必须在函数执行的时候传递进去的参数,且顺序与参数顺序相同。

  • 默认参数:

在定义函数的时候,定义的参数含有默认值,通过赋值语句给他的是一个默认值。

def add(a, b = 1) # b是默认参数,默认值为1,a为必传参数

  • 可变参数:

没有固定的参数名和数量

def add(*args, **kwargs):
    ......

add(1, 2, 3, name = 'hongyun', age = 23)

1, 2, 3 对应*args

name = 'hongyun', age = 23 对应**kwargs

*args:将无参数的值合并成元组

**kwargs:将有参数与默认值的赋值语句合并成字典

参数规则:

def funcname(a, b =1, *args, **kwargs):

参数的定义从左到右依次是 必传参数,默认参数,可变元组参数,可变字典参数

4.1.3 函数参数类型定义

注:参数定义在python3.7之后可用

def person(name:str, age:int = 23):
    print(name, age)

必传参数:参数名+:+类型函数

默认参数:参数名+:+类型函数+=+默认值

函数不会对参数类型进行验证

4.1.4 变量

局部变量

全局变量

global:

name = 'hongyun'
def test():
    global name
    name = 'limei'  # 函数体内给全局变量重新赋值

global传递的变量只支持数字,字符串,空类型以及bool类型,如果要使用全局变量的字典,元组,列表是不需要使用global的,可直接使用。

4.1.5 递归函数

一个函数不停的将自己反复执行

def test(a):
    print(a)
    return test(a)

递归函数的说明:

  • 防止内存溢出
  • 避免滥用递归
4.1.6 匿名函数lambda

匿名函数:

  • 定义一个轻量化的函数
  • 即用即删除,很适合需要完成一项功能,但此功能只在此处使用
f = lambda : value # 无参数
f()

lambda x, y: x*y  # 有参数
f(3,4)
user = [
    {'name': 'hongyun'},
    {'name': 'dejiang'},
    {'name': 'awei'}

]
user.sort(key = lambda x: x['name'])
print(user)

7、面向对象

7.1 初识面向对象

7.1.1 什么是面向对象编程

面向对象编程:

  • 利用(面向)对象(属性与方法)去进行编码的过程
  • 自定义对象数据类型就是面向对象中的class类的概念
7.1.2 类的定义和使用
class Name(object):
    attr = something
    def func(self):
        do
class Person(object):
    name = 'hongyun'
    
    def dump(self):
        print(f'{self.name} is dumping')
        
hy = Person()
print(hy.name)
hy.dump()
7.1.2 类的参数self

self是类函数中的必传参数,且必须放在第一个参数位置

self是一个对象,它代表实例化的变量自身

self可以直接通过点来定义一个类变量 self.name = 'hhio'

self中的变量与含有self参数的函数可以在类中任何一个函数中随意调用

非函数中定义的变量在定义的时候不用self

7.1.3 类的构造函数

构造函数:类中的一种默认函数,用来将类实例化的同时,将参数传入类中

构造函数的创建:

def __init__(self, a , b):
    self.a = a
    self.b = b
7.1.4 对象的生命周期

7.1.5 私有函数和私有变量

定义方法:

在变量或函数前添加__(2个下划线),变量或函数名后无需添加

class Person(object):
    def __init__(self, name):
        self.name = name
        self.__age = 23
    def dump(self):
        print(self.name, self.__age)
    def __cry(self):
        return 'I am crying, missing my lover'
7.1.6 装饰器

装饰器:也是一种函数;可以使用函数作为参数,也可以返回函数;接收一个函数,内部对其进行处理,然后返回一个新函数,动态地增强函数功能;将c函数在a函数中执行,在a函数中可以选择执行或不执行c函数,也可以对c函数的结果进行二次处理。

定义装饰器:

def out(func_args):    # 外围函数  
    def inter(*args, **kwargs):  # 内嵌函数
        return func_args(*args, **kwargs)
    
    return inter   # 外围函数返回内嵌函数

装饰器的用法:

  • 将被调用的函数直接作为参数传入装饰器的外围函数括弧
def a(func):
    def b(*args, **kwargs):
        return func(*args, **kwargs)
    return b

def c(name):
    print(name)
    
a(c('hongyun'))  # 调用,打印 hongyun
  • 将装饰器与被调用函数绑定在一起
def a(func):
    def b(*args, **kwargs):
        return func(*args, **kwargs)
    return b

@a
def c(name):
    print(name)
    
c('hongyun')  # hongyun
7.1.7 类的装饰器
  • classmethod:类函数可以不经过实例化而直接被调用

使用方法:

@classmethod
def func(cls, ...):
    do something

参数:cls -> 替代普通类函数中的self,cls是class的简写,代表当前操作的类

class Test(object):
    @classmethod
    def add(cls, a, b):
        return a + b
    
Test.add(1, 2)
  • statcmethod:类函数可以不经过实例化而直接被调用,被该装饰器调用的函数不能传递self或cls参数,且无法在该函数内调用其他类函数或类变量

使用方法:

@staticmethod
def func(...):
    do something

参数:函数内不能有self或cls参数

class Test(object):
    @staticmethod
    def add(a, b):
        return a + b
    
Test.add(1, 2)

property:类函数的执行免去括弧,类似于调用属性(变量)

使用方法:

@property
def func(self):
    do something
class Test(object):
    def __init__(self, name):
        self.name = name
        
    @property
    def call_name(self):
        return 'hello {}'.format(self.name)
    
test = Test('bilibili')
result = test.call_name   # 调用不需要加括弧
print(result)  # hello bilibili

但是如果需要修改name的值,怎么办呢

class Test(object):
    def __init__(self, name):
        self.name = name
        

    @property
    def name(self):
        return self.__name
    
    @name.setter
    def name(self, value):
        self.__name = value

test = Test('bilibili')
result = test.name   # 调用不需要加括弧
print(result)  # bilibili

test.name = 'hongyun'
print(test.name)  # hongyun

7.2 继承

7.2.1 类的继承
class Parent(object):    # object是内部定义的类,是所有自定义类的父类
    def talk(self):
        print('talk')        
    def eat(self):
        print('eat')
        
class Child(Parent):
    def drive(self):
        print('child can drive vehicle')
  • 定义子类时,将父类传入子类参数内
  • 子类实例化可以调用自己与父类的函数和变量
7.2.2 super函数

python子类继承父类的方法而使用的关键字,当子类继承父类后,就可以使用父类方法

使用方法:

class Parent(object):
    def __init__(self):
        print('hello i am parent')
        
class Child(Parent):
    def __init__(self):
        print('hello i am child')
        super(Child, self).init() # 参数传入子类类名,python3.0可以不用传参数

7.3 多态

7.3.1 类的多态

多态的用法:

  • 子类重写父类的函数(方法)
7.3.2 类的多重继承

多重继承:可以 继承多个父类(基类)

多重继承的实现:

class Child(Parent1, Parent2, Parent3, ...)
  • 将被继承的类放入子类的参数中,用逗号隔开
  • 如果父类中存在相同函数名的函数,那么调用的是从左到右算起的第一个父类中的函数
  • 所以括弧中的继承顺序是从左往右依次继承

7.4 类中的高级函数

7.4.1 __str__函数

功能:如果定义了该函数,当print当前实例化对象的时候,会返回该函数的return信息

使用:

def __str__(self):
    return str_type

返回值:一般返回对于该类的描述信息

class Test(object):
    def __str__(self):
        return '这是关于类的描述'
    
test = Test()
print(test)   # 这是关于类的描述
7.4.2 __getattr__函数

功能:当调用的属性或方法不存在时,会返回该方法定义的信息

使用:

def __getattr__(self, key):
    print(something...)

参数:key -> 调用任意不存在的属性名

返回值:可以是任意类型也可以不进行返回

class Test(object):
    def __getattr__(self, key):
        print('这个key:{}不存在!请检查。'.format(key))
        
test = Test()
test.nonExistFunc()  # 这个key:nonExistFunc不存在!请检查。
7.4.3 __setattr__ 函数

功能:拦截当前类中不存在的属性与值

使用:

def __setattr__(self, key, value):
    self.__dict__[key] = value

参数:key -> 当前的属性名

​ value -> 当前的参数对应的值

无返回值

class Test(object):
    def __setattr__(self, key, value):
        if key not in self.__dict__:
            self.__dict__[key] = value
            
test = Test()
test.name = 'hongyun'
print(test.name)  # hongyun
7.4.4 __call__ 函数

功能:本质是将一个类变成一个函数

使用:

def __call__(self, *args, **kwargs):
    print('call will start')

参数: 可传任意参数

返回值:与函数情况相同可有可无

class Test(object):
    def __call__(self, **kwargs):
        print('args is {}'.format(kwargs))
        
test = Test()
test(name = 'hongyun')  # args is {'name': 'hongyun'}

7.5 异常

7.5.1 初识异常

异常:程序的错误,会导致程序崩溃。

异常处理:能监控并捕获异常,将异常部位的程序进行修理使得程序继续正常运行

异常的语法:

try:
    <代码块1> # 被try关键字检查并保护的业务代码
except <异常的类型>:
    <代码块2> # 代码块1出现错误后执行的代码块
def upper(str_data):
    new_str = ''
    try:
        new_str = str_data.upper()
    except:
        print('给的参数不是字符串')
    return new_str

result= upper(1)
print(result)

通用捕获异常:

在无法确定是哪种异常的情况下使用的异常捕获方法

try:
    <代码块>
except Exception as e:
    <异常代码块>
def upper(str_data):
    new_str = ''
    try:
        new_str = str_data.upper()
    except Exception as e:
        print('给的参数不是字符串,而是{type(str_data)},并且{e}')
    return new_str

捕获具体异常:

在确定是哪种异常的情况下使用的捕获方法

try:
    <代码块>
except <具体异常类型> as e:
    <异常代码块>
try:
    1/0
    print('这里不执行')  # 出现异常后,后面的代码不执行
except ZeroDivisionError as e:
    print(e)    # division by zero
7.5.2 捕获多个异常

方法1:

try:
    print('start')
    res = 1/0
    print('end')
except ZeroDivisionError as e:
    print(e)
except Exception as e:
    print('this is a public except, bug is : %s' % e)

当except代码块有多个的时候,捕获到第一个异常之后,不会再继续往下捕获。

方法2:

try:
    print('try start')
    res = 1/0
    print('end')
except (ZeroDivisionError, Exception) as e:
    print(e)

当except代码后面的异常类型使用元组包裹起来,捕获到哪种就抛出哪种异常。

7.5.3 Python中的异常类型

异常类型集合

异常名称 说明
Exception 通用异常类型(所有异常类型的基类)
ZeroDivisionError 不能使用0作为除数
AttributeError 对象没有这个属性
IOError 输入输出操作失败
IndexError 没有当前的索引
KeyError 没有这个键值(key)
NameError 没有这个变量(未初始化对象)
SyntaxError Python语法错误
SystemError 解释器的系统错误
ValueError 传入的参数错误
7.5.4 异常中的finally
try:
    <代码块1>
except:
    <代码块2>
finally:
    <代码块3>
  • 无论是否发生异常,一定会执行的代码块
  • 在函数中,即便在try或except中进行了return也依然会执行finally代码块
  • try语法至少要伴随except或finally中的一个
def func1():
    try:
        print('this is try')
        return 'try'
    except Exception as e:
        print(e)
    finally:
        print('this is finally')

test = func1()
print(test)

"""
this is try
this is finally
try
"""
def func2():
    try:
        return 'try'
    except Exception as e:
        return 'except'
    finally:
        return 'finally'

test1= func2()
print(test1)  # finally

如果try,except和finally都有return,finally的优先级高

7.5.5 自定义异常与抛出异常

自定义抛出异常函数---raise

用法:

raise 异常类型(message)

参数:message -> 错误信息

def testFunc(number):
    if number == 100:
        raise ValueError('number can not be 100')
    return number

res = testFunc(100)
print(res)  
'''
  File "/home/howardy/Documents/pyCharmProj/except.py", line 27, in testFunc
    raise ValueError('number can not be 100')
ValueError: number can not be 100
'''

自定义异常类:

  • 继承基类---Exception
  • 在构造函数中定义错误信息
class NewError(Exception):
    def __init__(self, message):
        self.message = message

def testff():
    raise NewError('this is a bug')

try:
    testff()
except Exception as e:
    print(e) # this is a bug
class NumLimitError(Exception):
    def __init__(self, message):
        self.message = message

class NameLimitError(Exception):
    def __init__(self, message):
        self.message = message

def funcNum(number):
    if number > 100:
        raise NumLimitError('数字不能大于100')
    return number

def funcName(name):
    if name == 'hong':
        raise NameLimitError('名字不能是hong')
    return name

try:
    funcName('hong')
except NameLimitError as e:
    print(e)

try:
    funcNum(234)
except NumLimitError as e:
    print(e)
    
funcNum(234)

'''
名字不能是hong
数字不能大于100
Traceback (most recent call last):
  File "/home/howardy/Documents/pyCharmProj/custom_exception.py", line 29, in <module>
    funcNum(234)
  File "/home/howardy/Documents/pyCharmProj/custom_exception.py", line 11, in funcNum
    raise NumLimitError('数字不能大于100')
__main__.NumLimitError: 数字不能大于100
'''
7.5.6 断言assert

断言的功能:用于判断一个表达式,在表达式条件为false的时候触发异常

用法:

assert expression, message

参数:expresssion -> 表达式,一般是判断相等,或者判断是某种数据类型的bool判断语句

​ message -> 具体的错误信息

返回值:无返回值

8、包与模块

8.1 Python中的包

8.1.1 什么是Python的包、模块

包:就是文件夹,包中还有包,就是子文件夹

模块:一个个Python文件就是模块

层级关系:包-->模块-->函数

包的身份证:

  • __init__.py是每一个Python包里必须包含的文件

创建一个包:

  • 要有一个主题,明确功能,方便使用
  • 层次分明,调用清晰
8.1.2 包的导入 import

功能:将Python中的某个包(或者模块),导入到当前的.py文件中

用法:import package

参数:package:被导入包的名字

注意:只会拿到对应包下__init__中的功能或者当前模块下的功能

8.1.3 模块的导入 from ... import ...

功能:通过从某个包找到对应的模块并导入

用法:from package import module

参数:package:来源的包名

​ module:包中的目标模块

注意:导入灵活多变,也可以是如下导入

from package.module import func

from package1.sub_package.module import func

可以导入之后重命名,比如:

from animal.cat import jump as cat_jump

这样,cat_jump()函数就是导入的函数(重命名后的)

同理也可以导入模块中的类。

8.1.4 强大的第三方包

第三方包:企业或者个人开发好的功能封装成包(模块)发布到网上的

利用pip和easy_install获取第三方包:

Python的第三方包管理工具,pip的使用率最高

Python3.4以上版本在安装Python的时候已经自带了这两种管理工具

旧版本的Python也可以通过https://pip.pypa.io/en/stable/

使用:

pip install 包名
easy_install django  # django是

可以在github.com上寻找包,但是它是国外的网站,一般下载版本会比较慢,也可以在国内的网址下载,比如下面的网址:

阿里云:http://mirrors.aliyun.com/pypi/simple/

中科大:https://pypi.mirrors.ustc.edu.cn/simple/

安装指令:

在pycharm terminal输入:pip install -i http://mirrors.aliyun.com/pypi/simple/ ipython

8.1.5 datetime包

datetime包的常用功能:

  • 日期与时间的结合
  • 获取当前时间
  • 获取时间间隔
  • 将时间对象装换成时间字符串
  • 将字符串转成时间类型

获取当前时间

导入包与模块:

from datetime import datetime

使用:

datetime.now()
# Out[2]: datetime.datetime(2021, 7, 26, 15, 12, 55, 89076) 
# 输出对应 年-月-日-时-分-秒-毫秒

获取时间间隔

导入:

from datetime import datetime
from datetime import timedelta

使用:

timeobj = timedalta(days = 0, seconds = 0, microsends = 0, milliseconds = 0, minutes = 0, hours = 0, week =0)

使用例子:

from datetime import datetime
from datetime import  timedelta
before_one_day = timedelta(days = 1)
yesterday = datetime.now() - before_one_day
yesterday
Out[5]: datetime.datetime(2021, 7, 25, 15, 24, 3, 808918)

时间对象转字符串

时间转字符串:

date_str = now.strftime(format)

使用举例:

from datetime import datetime
date = datetime.now()
str_date = date.strftime('c')
str_date
# Out[8]: '2021-07-26 15:49:08'

将时间字符串转时间类型

datetime.strptime(tt, format)

参数:tt -> 符合时间格式的字符串

​ format -> tt时间字符串匹配规则

使用举例:

from datetime import datetime
str_date = '2021-07-26 15:56:56'
date_obj = datetime.strptime(str_date, '%Y-%m-%d %H:%M:%S')
date_obj
# Out[11]: datetime.datetime(2021, 7, 26, 15, 56, 56)

时间格式字符:

字符 描述
%Y 年份,如2021
%m 月份,1~12
%d 月中的一天(1~31)
%H 一天中的第几个小时(00~23)
%I 一天中的第几个小时(01~12)
%M 当前的第几个分(00~59)
%S 当前分的第几秒(0~61)闰年多占2秒
%f 当前的第多少毫秒
%a 简化的星期,如星期三 Wed
%A 完整的星期,如星期三Wednesday
%b 简化的月份,如二月 Feb
%B 完整的月份,如二月February
%c 本地日期和时间,如Wed Feb 5 10:14:14 2020
%p 显示上午还是下午,AM/PM
%j 一年中的第几天
%U 一年中的星期数
8.1.6 时间戳

时间戳:1970年1月1日00时00分00秒至今的总毫秒数

  • timestamp
  • float

生成时间戳的函数time:

import time 
time.time()
# Out[13]: 1627294664.0623467

获取本地时间函数localtime:

import time
time.localtime(timestamp)  # 参数时间戳timestamp(可不传)
# Out[14]: time.struct_time(tm_year=2021, tm_mon=7, tm_mday=26, tm_hour=18, tm_min=20, tm_sec=50, tm_wday=0, tm_yday=207, tm_isdst=0)

暂停函数sleep:

import time 
time.sleep(second)  # second:希望程序被暂停的秒数

注意:time包中也有strftime和strptime,使用方法和datetime的一样

datetime中生成时间戳的函数

from datetime import datetime
now = datetime.now()
datetime.timestamp(now)
# Out[3]: 1627295740.944299

datetime时间戳转时间对象:

from datetime import datetime
datetime.fromtimestamp(timestamp)  # timestamp:时间戳
from datetime import datetime
now = datetime.now()
now_timestamp = datetime.timestamp(now)
datetime_obj = datetime.fromtimestamp(now_timestamp)
datetime_obj
# Out[7]: datetime.datetime(2021, 7, 26, 18, 35, 40, 944299)

8.2 python中的os包

import os

函数名 参数 描述 举例 返回值
getcwd - 返回当前的路径 os.getcwd() 字符串
listdir path 返回指定路径下所有的文件和文件夹 os.listdir('c://usr') 返回一个列表
makedirs path mode 创建多级文件夹 os.makedirs('d://imooc/py') -
removedirs path 删除多级文件夹 os.removedirs('d://imooc/py') -
rename oldname, newname 给文件或文件夹改名 os.rename('d://imooc','d://imoc') -
rmdir path 只能删除空文件夹 os.rmdir('d://imooc') -
8.2.1 os.path模块常用方法
函数名 参数 描述 举例 返回值
exists path 文件或路径是否存在 os.exists('d://imoc') bool
isdir path 是否是路径 os.isdir('d://imoc') bool
isabs path 是否是绝对路径 os.path.isabs('test') bool
isfile path 是否是文件 os.path.isfile('usr/proj/a.py') bool
join path,path* 路径字符串合并 os.path.join('d://','test') 字符串
split path 以最后层路径为基准切割 os.path.split('d://test') 列表
8.2.2 sys中常用的方法
函数名 参数 描述 举例 返回值
modules - py启动时加载的模块 sys.modules 列表
path - 返回当前py的环境路径 sys.path 列表
exit arg 退出程序 sys.exit(0) -
getdefaultencoding - 获取系统编码 sys.getdefaultencoding() 字符串
platform - 获取当前系统平台 sys.platform() 字符串
version - 获取当前Python版本 sys.version 字符串
argv *args 程序外部获取参数 sys.argv 列表

8.3 文件操作

8.3.1 文件的创建与写入

利用内置函数open获取文件对象

功能:生成文件对象,进行创建、读写操作

使用:

open(path, mode)
#  参数说明:path-> 文件路径
#          mode -> 操作模式
#  返回值:返回文件对象

举例:

f = open('usr/date.txt', 'w')

文件操作模式---写入

模式 描述
w 创建文件,若文件已存在,则原文件将被新文件覆盖
w+ 创建文件并读取文件
wb 二进制形式创建文件,即可写入byte类型内容
wb+ 二进制形式创建或追加内容
a 追加内容
a+ 读写模式的追加
ab+ 二进制形式读写追加

文件对象的操作方法:

方法名 参数 描述 举例
write Message 写入信息 f.write('hello\n')
writelines Message_list 批量写入 fwritelines(['hello\n', 'world\n'])
close - 关闭保存且 f.close()
8.3.2 文件的读取操作

文件操作模式---读取

模式 描述
r 读取文件
rb 二进制形式读取文件

文件对象的操作方法---读

方法名 描述 举例
read 返回整个文件字符串 f.read()
readlines 返回文件列表 f.readlines()
readline 返回文件中的一行 f.readline()
mode 文件模式 f.mode()
name 返回文件名称 f.name()
closed 文件是否关闭 f.closed()

注意:操作完成后,必须使用closed方法

8.4 序列化

8.4.1 初识序列化

序列化(Serialization):将对象的状态信息转换为可以存储或传输的形式的过程

可序列化的数据类型:

  • number
  • str
  • list
  • tuple
  • dict

Python的json模块:

方法名 参数 描述 举例 返回值
dumps obj 对象序列化 json.dumps([1,2]) 字符串
loads str 反序列化 json.loads('[1,2,3]') 原始数据类型

Python的pickle模块:

方法名 参数 描述 举例 返回值
dumps obj 对象序列化 pickle.dumps([1,2]) 比特
loads byte 反序列化 pickle.loads('[1,2,3]') 原始数据类型
8.4.2 yaml文件

用途:文本文件、服务配置文件

xxx.yaml

name:       # key
  xiaomu    # value
age:
  10
xinqing:
  - haha    # 列表
  - heihei
new:
  a: b      # 字典
  c: 1

Python的第三方模块---pyyaml:

pip install pyyaml

import pyyaml

读取yaml的方法:

用法:

f = open(yaml_file, 'r')
data = yaml.load(f.read())
f.closed()

返回值:字典类型

{
    'name': 'xiaomu',
    'age': 10,
    'xinqing': ['haha','heihei'],
    'new': {'a':'b', 'c':1}
}

8.5 Python中的加密工具

8.5.1 hashlib模块介绍
  • 难破解
  • 不可逆

常用加密方法:

函数名 参数 介绍 举例 返回值
md5 byte Md5算法加密 hashlib.md5(b' hello') Hash对象
sha1 byte Sha1算法加密 hashlib.sha1(b' hello') Hash 对象
sha254 byte Sha256算法加密 hashlib.sha256(b' hello') Hash 对象
sha512 byte Sha512算法加密 hashlib.sha512(b' hello') Hash 对象

生成加密字符串

hashobj = hashlib.md5(b' hello')
result = hashobj.hexdigest()
print(result)
# 292a5af68d31c10e31ad449bd8f51263
# coding:utf-8

import hashlib
import time

hase_sign = 'muke'
def custom():
    a_timestamp = int(time.time())
    _token = '%s%s' % (hase_sign, a_timestamp)
    hashobj = hashlib.sha1(_token.encode('utf-8'))
    a_token = hashobj.hexdigest()
    return a_token, a_timestamp

def b_service_check(token, timestamp):
    _token = '%s%s' % (hase_sign, timestamp)
    b_token = hashlib.sha1(_token.encode('utf-8')).hexdigest()
    if token == b_token:
        return True
    else:
        return False

if __name__ == '__main__':
    need_help_token, timestamp = custom()
    result = b_service_check(need_help_token, timestamp)
    if result:
        print('a合法,b服务可进行帮助')
    else:
        print('a不合法,b服务不可进行帮助')
8.5.2 base64模块介绍
  • 通用型
  • 可解密

base64包常用方法:

函数名 参数 描述 举例 返回值
encodestring Byte base64加密 base64.encodestring(b' py') Byte
decodingstring Byte base64解密 base64.decodingstring(b'e Glhb211\n') Byte
encodebytes Byte base64加密 base64.encodestring(b' py') Byte
decodingbytes Byte base64解密 base64.decodingstringb'e Glhb211\n') Byte
# coding:utf-8

import base64

def encode(data):
    if isinstance(data, str):
        data = data.encode('utf-8')
    elif isinstance(data, bytes):
        data = data
    else:
        raise TypeError('date need bytes or str')
    return base64.encodebytes(data).decode('utf-8')

def decode(data):
    if not isinstance(data, bytes):
        raise TypeError('data need be bytes')
    return base64.decodebytes(data).decode('utf-8')


if __name__ == '__main__':
    result = encode('hello xiaomu')
    print(result)
    new_result = decode(result.encode('utf-8'))
    print(new_result)

8.6 日志

日志的等级:

debug < info < warning < error < critical

8.6.1 logging模块的使用

logging.basicConfig

参数名 作用 举例
level 日志输出等级 level = logging.DEBUG
format 日志输出格式
filename 存储位置 filename = 'd://back.log'
filemode 输入模式 filemode = "w"

format具体格

格式符 含义
%(levelname)s 日志级别名称
%(pathname)s 执行程序的路径
%(filename)s 执行程序名
%(lineno)d 日志的当前行号
%(asctime)s 打印日志的时间
%(message)s 日志信息

常用日志格式符方案:

format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'

举例:

# coding:utf-8

import logging
import os

def init_log(path):
    if os.path.exists(path):
        mode = 'a'   # log文件后追加内容
    else:
        mode = 'w'   # 创建文件并添加内容
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s %(filename)s %(lineno)d %(levelname)s %(message)s',
        filename=path,
        filemode=mode
    )
    return logging

current_path = os.getcwd()
path = os.path.join(current_path, 'back_log')
log = init_log(path)

log.info('这是第一条执行信息')
log.warning('this is a warning')

8.7 虚拟环境

8.7.1 认识虚拟环境

8.7.2 Python中的虚拟环境工具
  • virtualenv
  • pyenv

pip install virtualenv

8.9 常用函数集合

8.9.1 常用函数
函数名 参数 描述 返回值 举例
abs Number 返回数字绝对值 正数字 abs(-10)
all List 判断列表内容是否全是true bool all(['', '123'])
help object 打印对象的用法 help(list)
enumerate iterable 迭代时记录索引 for index, item in enumerate(list)
input Str 命令行输入内如 Str input('请输出内容:')
isinstance Object, type 判断对象是否是某种类型 bool isinstance('a', str)
type Object 判断对象的类型 Str type(10)
vars instance 返回实例化的字典信息 dict
dir object 返回对象中所有可用方法和属性 List dir('asd')
hasattr Obj, key 判断对象中是否有某个属性 bool hasattr('run', 'sporter')
setattr Obj, key, value 为实例化对象添加属性与值 setattr(instance, 'run', 'go')
getattr Obj, key 通过对象获取属性 类型 getattr(obj, key)
any iterable 判断内容是否有true值 bool any([1,3, ''])
8.9.2 python中的random模块
  • random.random

随机返回0~1之间的浮点数

  • random.uniform

产生一个a, b之间的的随机浮点数

random.uniform(1, 10)

  • random.randint

产生a, b之间的随机整数

  • random.choice

返回对象中的一个随机元素

random.choice(['1', '2', '3']) '2'

random.choice('abc') c

  • random.sample

随机返回对象中指定的元素(列表)

random.sample(['a', 'b', 'c'], 2) ['a', 'c'] #第二个参数表示数量

random.sample('abx', 2) ['b', 'x']

  • random.randrange

获取区间内的一个随机数

random.randrange(0, 100, 1) 51 # 参数:起始, 结尾, 步长

random.choice(range(0, 100, 1)) 45

8.10 迭代器

8.10.1 什么是迭代器

迭代器是程序设计的软件设计模式,可在容器对象(列表,元组等)上遍历访问的接口,设计人员无需关心容器对象的内存分配和实现细节。

8.10.2 生成迭代器和使用

生成 迭代器-iter

iter(iterable)     # iterable: 可迭代的数据类型

使用迭代器-next

next(iterator)      # iterator: 迭代器对象
8.10.3 迭代器常用方法

for循环生成发-yield

def test():
    for i in range(12):
        yield i

for循环一行生成迭代器

res = (i for i in [1, 2, 3])
8.10.4 高阶函数
  • filter

功能:对循环根据过滤条件进行过滤

使用:

filter(func, list)    # func: 对每个item进行条件过滤的定义
                      # 需要过滤的列表

举例:

res = filter(lambda x:x>1, [0,1,2])
print(list(res))  # [2]
  • map

功能:对列表中的每个成员是否满足条件返回对应的True或False

使用:

map(func, list)       # func: 对list每个item进行条件满足的判断
                      # list: 需要过滤的列表

举例:

res = map(lambda x: x>1, [0, 1, 2])
print(list(res)) # [False, False, True] 
  • reduce

功能:对循环前后两个数据进行累加

使用:

reduce(func, list)      # func: 对数据累加的函数
                        # list: 需要处理的列表

举例:

from functools import reduce

res = reduce(lambda x, y: x + y, [1, 2, 3])
print(res)  # 6
posted @ 2023-12-14 11:10  运运翻牌了Howardy  阅读(38)  评论(0)    收藏  举报