文件操作
with open("xxx/xx/xx","wra+",encoding="utf-8")as f:
f.read()
f.write()
f.readline()
f.readlines()
# 使用with open比直接使用open更加方便,直接使用open需要.close()关闭文件,否则会出现资源滥用
# 模式主要有以下几种
w 写模式,向指定文件写入内容,没有则创建一个新文件,写入的内容会覆盖掉原有文件的内容
r 读模式,想指定文件读内容,内容不存在则报错
a 向指定文件追加内容,文件存在是追加不存在是新建再追加
x 文件存在则报错,创建再写。
+ 让模式不止只有读写一种功能,而是即读又写
补充 与t连用表示读写的数据是文本类型可是省略默认就是文本类型,比如wt/rt等
与b连用表示读写的数据是二进制类型,图片视频就属于二进制类型的数据,wb,rb等
路径相关
window下,用r转义\或者双写\\转义
r ”C:\Users\username\Desktop“
”C:\\Users\\username\\Desktop“
Linux下,/
/etc/passwd
相对路径,相对于当前的路径去查找的路径
project/text.txt
绝对路径,从根目录去找的路径(相对于相对路径来说更加准确)
C:\Users\username\Desktop\project/text.txt
开发了,为了项目的兼容性(在各个系统上都能运行),使用路径时通常都是使用内置函数拼接路径
import os
# 1.获取当前运行的py脚本所在路径
abs = os.path.abspath(__file__)# 2.获取项目当前文件夹的路径
path = os.path.dirname(abs)
函数
定义
def func():
pass
调用
func()
参数
形式参数:在定义函数时函数预定义的变量参数
def text(var1,var2)
实际参数:在调用时所传入函数的参数
text(1,2)
位置传参:在传入实际参数时,如果是按照位置的前后参与参数就称为位置传参
关键字传参:通过参数的命名参数而是通过位置传参
def text(var1,var2)
text(var1=1,var2=2)
定义函数时可以给实际参数传一个默认值,但调用函数时不传参则使用默认参数的值,传参就使用传入的值
def func(a1, a2, a3=10):
位置和关键混合使用时,关键字传参要写在后面
func(12, 9, a3=90)
动态参数:当形式参数前面加一个*号时,表示传入的参数是可变的,可以传入很多参数
def func(*args)
func(22)
func(22,33)当形式参数前面加一个**号时,表示传入的参数是一个字典类型,并且并不规定数量
def func(**kwargs)
func("name" = "siri","age"=18)
函数的返回值
函数的返回值可以是任意类型
函数的返回值默认是None
函数一旦遇到return就会立即退出函数
函数的返回值返回的是一个地址
函数执行传参时,传递的是内存地址
函数在只有执行了才会在内存开辟一片内存地址,只被定义没有被调用时并未来开辟内存空间
函数执行完毕之后,函数内部的变量都会被释放,内存地址的引用计数器-1
函数的默认参数会创建一块区域并维护这个默认值,但参与参数时会指向新的地址
动态参数不仅在设置形参时可以用,在传递实参时也可以
函数名只是一个变量,它代指函数本身
作用域
一块内存空间,空间的数据是可以共享,但同时也是相互独立的
python中一个函数就是一个作用域,在作用域里面定义的变量称局部变量
一个py文件里定义的称全局变量
局部作用域中想使用某个变量时,寻找的顺序为,优先在局部作用域寻找,没有再去上一级寻找
局部作用域无法对全局变量进行重新赋值
global关键字可实现局部作用域对全局变量进行重新复制
装饰器
基于特殊的闭包开发出了一个在函数执行前后增加功能的函数
def outfunc(oringe): def inner(): print("执行前") res = oringe() print("执行后") return inner @outfunc def fun1(): pass fun1()@outfunc就成为装饰器,等同fun1 = outfunc(fun1)
fun1 此时应该是等于outfunc的返回值的,也就是fun1=inner
所以fun1()等于inner()
上述代码的输出结果为
执行前
执行后
匿名函数
定义函数时包括函数名和函数体,匿名函数就是通过lambda定义一个没有函数名的函
lambda 参数:函数体
只能写单行代码,返回值为代码执行结果
lambda x : x*x
三元运算
条件成立 if 条件 else 条件不成立
“错误” if i <= 0 "正确"
生成器
函数中有yield存在时,这个函数就是生产生成器函数。
执行生成器函数时会返回一个生成器对象
通过next(name)会调用生成器对象,每调用一次就会从上一次的位置基础上再继续向下执行。
推导式
通过一行代码实现创建list、dict、tuple、set 的同时初始化一些值。
list = [ i for i in range(10)]
元组
不会立即执行内部循环去生成数据,而是得到一个生成器。
模块
一类函数功能的集合,通常一个模块就是一个py文件
多个朋友文件组成的文件夹就叫做包
包中一般都有一个默认的__init__.py文件
用来注释当前包的内容
导入
在Python内部默认设置了一些路径,导入模块或包时,都会按照指定顺序逐一去特定的路径查找。
'/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages',
'/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_matplotlib_backend'想要导入任意的模块和包,都必须写在如下路径下,才能被找到。
import sys
sys.path.append("路径A")当执行一个py文件时
__name__ = "__main__"
所以开发中一般会在入口文件出写上
if __name__ == "__main__" :
run()
深浅拷贝
浅拷贝
不可变类型,并未拷贝地址,拷贝的只是地址指向
可变类型,当只有一层时,拷贝的是变量地址,但嵌套多层时只拷贝第一层
深拷贝
不可变类型并未拷贝地址,拷贝的只是地址指向
可变类型,找到所有层级的 【可变类型】或【含有可变类型的元组】 均拷贝一份
元组
元组元素中无可变类型,不拷贝
元素元素中有可变类型,找到所有【可变类型】或【含有可变类型的元组】 均拷贝一份