1.容器类数据类型
a.列表:可变,有序
b.元祖:x, y = 12, 100; x, *num = 12, 33, 45, 23; (10,)。 不可变, 有序
c.字典:可变,无序
d.集合:可变,无序; 元素唯一; 支持数学的集合运算
2.函数
a.函数的声明
def 函数名(参数列表):
函数体
b.函数的调用
回到函数声明的位置
传参(使用实参给形参赋值)
执行函数体
确定返回值
回到函数调用的位置
c.参数
位置参数和关键字参数
参数的默认值
不定长参数 - 不带*的参数放在带一个*的前面,带一个*的放在带两个*的前面
def func1(name,*num)
print(name,num)
func1("aa",23,89,890)
参数和返回值类型说明:
def func1(age:int) -> int:
d.返回值
怎么确定函数的返回值 return
函数调用表达式的值就是返回值
调用函数:1)会执行函数体 2)获取返回值
e.匿名函数
lambda 参数列表: 返回值
func2 = lamabda x : x*2
f.作用域
全局变量 global(在函数中声明全局变量)
局部变量 nonlacal (在局部1中的局部声明局部1中的局部变量)
一、生成式
a.迭代器(iter)
容器,可以同时存储多个数据,取的时候只能一个一个的取,并且取过的数据在容器中就不存在了
b.生成器
就是迭代器, 数据是通过调用函数,获取yield后面的值而产生的。数据会在获取的时候去产生
调用一个带yield关键的函数,就是创建一个生成器。
1、什么是生成式
格式1:
(表达式 for 变量 in 序列) -->展开:
def func():
for 变量 in 序列:
yeild 表达式
注意:表达式的结果就是每次循环生成器产生的数据
这的for循环可以控制生成器产生数据的个数,和产生的值
例子:
gen1 = (x for x in range(4))
print(gen1)
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
gen1 = (x*10 for x in range(4))
print(gen1)
print(next(gen1))
print(next(gen1))
格式2:
(表达式 for 变量 in 序列 if 条件语句)-->展开:
def func1():
for 变量 in 序列:
if 条件语句:
yeild 表达式
例子:
gen3 = (x for x in range(10) if x % 2)
print(next(gen3)) #1
print(next(gen3)) #3
print(next(gen3)) #5
re = list(x for x in range(10) if x % 2 == 0)
print(re)
#交换字典中键值对的:dict1 = {"a":1,"b":2,"c":3} -->{"1":a,"2":b,"3":c}
dict1 = {"a":1,"b":2,"c":3}
dict2 = dict((value, key) for key, value in dict1.items())
print(dict2)
二、模块的使用
1、什么是模块
python中一个py文件就是一个模块
2、怎么关联多个模
方式1:
import 模块名 - 将指定的模块导入到当前的模块中,导入所有的全局变量(模块名就是py文件名)
说明:
a.执行import的时候,实质会进入指定的模块对应的py文件中,去执行里面的代码
b.import导入模块的时候,会检测当前模块之前是否已经导入过,如果已经导入就不再导入
c.通过import去导入一个模块后,可以通过模块.全局变量去使用模块中的内容
例子:
print("===")
import test1
# 使用test1中的变量
a = test1.test1_a
# 调用test1中的函数
print("当前模块:",a)
test1.test1_func1()
方式2:
from 模块名 import 变量/函数名 - 导入模块中指定的变量或者函数
说明:
a.执行到导入模块的语句的时候,还是会执行模块中所有的语句
b.通过from-import导入的时候,导入多次还是会执行一次(查重)
c.使用的时候只能用import后面的变量或者函数,而且用的时候不用在前面加模块名
d.import后面可以使用逗号将多个变量/函数隔开,也可以使用*,将模块中所有的全局变量一起导入
例子:
from test2 import test2_a, test2_func1
# from test2 import * # 同时倒入test2中所有的全局变量
# from test1 import test1_a
print('当前模块', test2_a)
test2_func1()
# import random
# random.randint(10, 20)
# from random import randint
# randint(10, 20)
函数 - 对功能进行封装 - 获取当前时间对应的代码封装在函数中
模块 - 对多个功能和多个数据进行封装 - 将所有和时间相关的函数或者变量封装到一个py文件中
包 - 对多个模块进行封装 - 将多有和时间相关的py文件放在一个文件夹中
什么是包:含有__init__.py文件的文件夹
3、重命名
import 模块名 as 新模块名
form 模块名 import 变量名 as 新变量名
4、包的导入
import 包名 - 会直接执行包中的__init__.py 文件中的代码
import 包名.模块名 - 导入指定包中的指定模块
from 包名 import 模块名
form 包名.模块名 import 变量名
三、选择性导入
在模块中将不需要其他模块导入和执行的代码写到if __name__ == "__main__"语句中。
这样就可以阻止代码被其他模块执行
原理:每个模块都有一个__name__属性,默认值是模块对应的py文件的名字。
当正在直接执行模块的时候,模块的__name__属性值就会变成'__main__'。
当import模块的时候,执行模块,模块的__name__属性不是'__main__'
例子:
if __name__ == '__main__':
# 写在这儿的代码不会被其他模块执行; 声明在这儿的变量也不会被其他模块导入
print('')
四、文件操作
1、数据本地化
将数据以文件的形式存储到本地磁盘中。
(程序中变量保存的数据都是存到内存当中的,当程序运行结束,内存中的数据全部销毁)
常见数据本地化方式:二进制文件(音频,视频,压缩包等),普通文本文件,json和xml文件,数据库文件等
2、文件操作(读和写)
文件操作的固定步骤:打开文件(新建文件)- 文件操作(读和写)- 关闭文件
3、打开文件
open(file,mode='r',...,endcoding) 返回的是被打开的文件对象(文件句柄)
说明:
file - 字符串;需要打开的文件的路径(可以是绝对路径,也可以是相对路径)
(一般不使用)绝对路径 -
相对路径 - (相对当前的py文件对应的目录)
aaa.txt 或者 ./aaa.txt
./ --- 当前目录(./可以省略)
../ --- 当前目录的上层目录
.../ --- 当前目录的上上层目录
mode - 打开方式;打开文件后不同的操作,对应的打开方式不一样
mode - 打开方式; 打开文件后不同的操作,对应的打开方式不一样
'r' - 默认值,以读的方式打开文件, 读出来的是字符串
'w' - 以写的方式打开文件
'rb'/'br' - 以读的方式打开,读出来的数据是二进制
'wb'/'bw' - 以写的方式打开,写二进制数据到文件中
'a' - 以写的方式打开,追加
'+' - 以读写方式打开
encoding - 文本文件编码方式,一般赋值为'utf-8'
utf-8 - 支持中文编码
gbk - 不支持中文编码
以读的形式打开一个文本文件,保存到变量f中。对f进行操作,就是对被打开的文件进行操作
f = open('files/蓝莲花.txt', 'r', encoding='utf-8')
4、文件的读操作
文件对象.read() - 从文件读写位置开始读到文件结尾(默认就是获取文件中所有的内容)
文件对象.readline() - 读一行
练习:将文件中的内容读完,要求一行一行读
content = f.readline()
while content:
print(content)
content = f.readline()
5、文件的写操作
文件对象.write(字符串) - 将字符串中的内容写进去文件中(会完全覆盖原文件中的内容)
'w' - 完全覆盖
'a' - 在原文件的最后添加
6.关闭文件
文件对象.close() - 关闭指定的文件
五、二进制文件的读写操作
1、open方法的另外一种写法:
whith open(文件路径,读写方式,encoding=编码方式) as 文件对象:
操作文件
--> 打开文件,将文件存在文件对象中。当文件操作完成会自动关闭
普通的文本文件也可以以二进制的形式读和写
2、二进制文件的读写
只要将读写方式设置为 'rb'/'br'就可以了。读出来的数据直接就是二进制数据
注意:二进制操作不能设置编码方式
# 二进制文件的读
with open('files/蓝莲花.txt', 'rb') as f:
content = f.read()
print(content, type(content))
with open('files/luffy4.jpg', 'rb') as f:
content = f.read()
print(content)
二进制写
with open('imge.jpg', 'wb') as f:
f.write(content)
图片下载
# response = requests.get('https://wx4.sinaimg.cn/mw690/4674e705ly1fck5nxjt74j20yi1pc7mb.jpg')
# with open('下载.jpg', 'wb') as ff:
# ff.write(response.content)
3.文件不存在
当以读的方式打开一个不存在的文件,会报'FileNotFindError'
当以写的方式打开一个不存在的文件,不会报错,并且会创建这个文件
# with open('bbb.txt', 'r') as f:
# print(f.read())
with open('ddd.txt', 'bw') as f:
# print(f.write())
pass
六、文件操作的应用
指导思想:
1.使用数据的时候去本地文件中取数据
2.数据修改后,将新的数据更新到本地文件中
写一个程序统计当前程序执行的次数。第一次运行程序打印1,第二次运行的时候打印2,以此类推
with open('files/count',encoding="utf-8") as f:
count = int(f.read())
print(count)
print("第%d次数进入程序"%count)
count += 1
with open('files/count',"w",encoding="utf-8") as f:
f.write(str(count))
print("第%d次数进入程序" % count