1. 函数
1.1 函数同时返回多个值
"""
函数同时返回多个值
需求: 自定义函数 calculate(), 接收两个整数, 然后返回它们的 加减乘除结果
"""
def calculate ( a, b) :
"""
自定义函数, 模拟计算器, 计算两个整数的 加减乘除结果
:param a: 要操作的第1个整数
:param b: 要操作的第2个整数
:return: 加减乘除结果
"""
sum = a + b
sub = a - b
mul = a * b
div = a // b
return sum , sub, mul, div
if __name__ == '__main__' :
result = calculate( 10 , 3 )
print ( result)
1.2 函数的参数写法-位置参数
"""
Python中 函数的参数写法 主要有如下的四种:
位置参数
关键字参数
默认参数(缺省参数)
不定长参数
细节:
1. 位置参数 和 关键字参数 是针对于 实参 来讲的
2. 缺省参数 和 不定长参数 是针对于 形参 来讲的
位置参数:
我们之前写的实参写法 就是位置参数, 即: 实参的 个数 和 顺序 必须和 形参保持一致
"""
def user_info ( name, age, address) :
print ( f'我叫: { name} , 今年 { age} 岁了, 我住在: { address} ' )
if __name__ == '__main__' :
user_info( '张三' , 23 , '北京' )
1.3 关键字参数
"""
关键字参数:
我们之前写的实参写法 就是位置参数, 即: 实参的 个数 和 顺序 必须和 形参保持一致.
如果 实参 和 形参的顺序不一致, 结果不一定是我们想要的, 所以为了更灵活的调用函数, 引入了: 关键字参数.
格式:
采用 键 = 值 的形式来传递 实参.
细节:
如果有多个参数(实参), 则: 位置参数在前, 关键字参数在后(且多个关键字参数之间, 没有顺序要求)
"""
def user_info ( name, age, address) :
print ( f'我叫: { name} , 今年 { age} 岁了, 我住在: { address} ' )
if __name__ == '__main__' :
user_info( address= '广州' , name= '李四' , age= 24 )
user_info( '王五' , address= '深圳' , age= 25 )
1.4 缺省参数
"""
缺省参数:
概述:
缺省参数也叫 默认参数, 即: 定义在 函数的形参列表的 最后.
格式:
采用 键 = 值 的形式来定义, 且必须放 形参列表的最后.
细节:
1. 调用函数时, 没有给缺省参数赋值, 则: 用缺省参数的默认值.
2. 调用函数式, 如果给缺省参数赋值, 则: 用赋的新值.
"""
def user_info ( name, age, address= '三亚' ) :
print ( f'我叫: { name} , 今年 { age} 岁了, 我住在: { address} ' )
if __name__ == '__main__' :
user_info( '张三' , 23 , '北京' )
user_info( '张三' , '北京' , 23 )
print ( '-' * 28 )
user_info( address= '广州' , name= '李四' , age= 24 )
user_info( '王五' , address= '深圳' , age= 25 )
print ( '-' * 28 )
user_info( '王五' , age= 25 )
1.5 不定长参数
"""
不定长参数:
概述:
不定长参数也叫 可变参数, 即: 参数的个数是可以变化的.
应用场景:
适用于 实参的个数不确定的情况, 就可以把 形参定义成 可变参数.
格式:
*args 只能接收所有的 位置参数, 封装到: 元组中.
**kwargs 只能接收所有的 关键字参数, 封装到: 字典中.
细节:
1. 关于实参, 位置参数在前, 关键字参数在后.
2. 关于形参, 如果两种 可变参数都有, 则: *args 在前, **kwargs 在后.
3. 关于形参, 如果既有 缺省参数 又有不定长参数, 则编写顺序为: *args, 缺省参数, **kwargs
"""
def method01 ( * args) :
print ( f'接收到的所有参数为: { args} ' )
print ( type ( args) )
def method02 ( ** kwargs) :
print ( f'接收到的所有参数为: { kwargs} ' )
print ( type ( kwargs) )
def method03 ( * args, ** kwargs) :
print ( f'args: { args} ' )
print ( f'kwargs: { kwargs} ' )
def method04 ( * args, name= '张三' , ** kwargs) :
print ( f'name: { name} ' )
print ( f'args: { args} ' )
print ( f'kwargs: { kwargs} ' )
if __name__ == '__main__' :
method01( 1 , '张三' , 23 )
print ( '-' * 28 )
method02( name= '张三' , age= 23 , phone= '13112345678' )
print ( '-' * 28 )
method03( 10 , 20 , 'aa' , name= '王五' , age= 25 , address= '杭州' )
print ( '-' * 28 )
method04( 10 , 20 , 'aa' , name= '王五' , age= 25 , address= '杭州' )
1.6 组包与拆包
"""
组包和拆包解释:
概述:
组包 和 拆包 是Python中的一种独有写法.
格式:
把 多个值 => 1个变量 的过程, 称之为: 组包.
把 1个(容器)变量 => 多个变量值 的过程, 称之为: 拆包.
应用场景:
1. 一次性获取到 元组, 列表, 字典中的每个数据.
2. 交换变量.
"""
list1 = [ 11 , 22 , 33 , 44 , 55 ]
tuple1 = ( 'aa' , 'bb' , 'cc' )
dict1 = { 'name' : '张三' , 'age' : 23 }
a, b, c, d, e = list1
print ( a, b, c, d, e)
x, y, z = tuple1
print ( x, y, z)
k1, k2 = dict1
print ( k1, k2)
1.7 引用
"""
引用 介绍:
概述:
Python中的引用 指的是 地址值,即: 变量在内存中的位置(地址).
格式:
id(变量名) 可以查看变量在内存中的地址.
细节:
1. Python中只有 引用传递, 即: 我们以前看到的所有赋值动作, 都是把 地址值拷贝(赋值)过去.
2. 区分 可变 和 不可变类型的依据: 在不改变地址值的情况下, 是否可以修改变量的内容, 可以: 可变类型, 不可以: 不可变类型.
可变: 列表, 字典, 集合.
不可变: int, float, bool, str, 元组
3. 观察如下的代码, 分析程序结果:
形参是可变类型: 形参的可变直接影响实参.
形参是不可变类型: 形参的改变对实参没有任何影响.
"""
"""
观察如下的代码, 分析程序结果, 得到的结论如下.
形参是可变类型: 形参的改变直接影响实参.
形参是不可变类型: 形参的改变对实参没有任何影响.
"""
def change ( num) :
num = 200
def change2 ( list1) :
list1[ 1 ] = 28
if __name__ == '__main__' :
a = 100
print ( f'调用 change 函数前, a: { a} ' )
change( a)
print ( f'调用 change 函数前, a: { a} ' )
list1 = [ 1 , 2 , 3 , 4 , 5 ]
print ( f'调用 change 函数前, list1: { list1} ' )
change2( list1)
print ( f'调用 change 函数后, list1: { list1} ' )
1.8 匿名函数
"""
匿名函数介绍:
概述:
没有名字的函数 就叫 匿名函数.
格式:
变量名 = lambda 形参列表 : 函数体(只能写一行代码, 且该行代码的结果会被自动返回)
细节:
1. Python的匿名函数 类似于 Java中的Lambda表达式.
2. 匿名函数适用于简单的业务需求, 即: 函数体只有一行代码的函数.
3. 匿名函数的应用场景:
当对方法仅调用一次.
匿名函数 可以作为 函数对象 进行传递.
"""
def get_sum ( a, b) :
return a + b
print ( get_sum( 10 , 20 ) )
my_get_sum = lambda a, b : a + b
print ( my_get_sum( 11 , 22 ) )
print ( '-' * 28 )
2. 文件
2.1 从文件中读取信息
"""
文件 介绍:
概述:
无论是 windows, Linux, Mac系统, 都是采用 文件 来管理数据的, 它们都是 文件管理系统.
之所以用文件来管理数据, 原因是因为: 内存中的数据是临时存储的, 电脑管理了, 数据就丢失了.
文件: 可以实现 永久 存储数据.
文件的类型:
文本文档, 图片类型, 视频类型, 音频类型......
文件的操作步骤:
1. 打开文件.
2. 读写操作.
3. 关闭文件.
打开文件 涉及到的API(Application Programming Interface, 应用程序编程接口), 就是: 别人写的 函数.
文件对象名 = open('文件路径', '打开模式', 码表) # 参3为可选项, 针对于 中文有效.
读取文件信息:
read(num) 一次读取num个字节的数据, 不写就一次性读取所有的数据.
readline() 一次读取一行.
readlines() 一次性读取读完所有行, 且会把每行数据封装到 1个列表中.
关闭文件:
文件对象名.close()
细节:
1. Python中, 路径的写法, 要么用 \\, 要么用 /, 要么用 r'一个\就行', 即: r'\' 会取消 \的转移含义, 当做1个普通字符来用.
2. 相对路径默认是相对于 当前项目的路径来写的, 即: 你直接写 1.txt, 想到于是 /当前项目路径/1.txt
"""
f = open ( './data/a.txt' , 'r' )
print ( f. readlines( ) )
f. close( )
"""
中文 解释:
计算机底层存储, 操作, 运算数据, 都是采用数据的 二进制(补码)形式, 所以中文, 特殊符号, 数字, 英文字母底层都是要转成二进制的.
后来科学家就提出了 码表的概念, 用来描述 字符 及其 对应的数字的关系. 例如: 'a' => 97, 'A' => 65, '0' => 48...
最早的码表 ASCII码表记录的就是: 英文字母, 数字, 特殊符号及其对应的 数字的关系.
后来随着计算机的普及, 各个国家都有了各个国家的 码表, 咱们国内使用最多的主要是 GBK系列, 1个中文 占 2个字节.
后来有个组织就统计全世界各个国家的码表, 制定了一张"万国码", 也叫"统一码", 这就是: Unicode系列的码表, 例如: utf-8, utf-16, utf-32...
总结:
国内主要用 GBK码表, 1个中文占 2个 字节.
国际通用码表 UTF-8, 1个中文占 3个字节.
无论是什么码表, 英文字母, 数字, 特殊符号都只占1个字节.
只要以后你遇到了乱码的情况, 不用想, 原因只会有1个: 编解码不一致.
"""
f = open ( './data/a.txt' , 'r' , encoding= 'utf-8' )
print ( f. read( ) )
f. close( )
2.2 往文件中写信息
"""
往文件中写信息:
write(数据) 往文件中写数据
writelines() 一次写多行
细节:
1. 注意写数据的模式, w: write,覆盖写入. a: append,追加写入
2. 读的时候, 如果 数据源文件不存在, 会报错. No Such File Or Directory...
3. 写的时候, 如果 目的地文件不存在, 会自动创建
"""
f = open ( './data/b.txt' , 'a' , encoding= 'utf-8' )
f. write( 'hello world!\n' )
f. write( '好好学习, 天天向上!' )
f. close( )
src_f = open ( './data/a.txt' , 'r' , encoding= 'utf-8' )
dest_f = open ( './data/b.txt' , 'w' , encoding= 'utf-8' )
while True :
data = src_f. read( 8192 )
if data == '' :
break
dest_f. write( data)
src_f. close( )
dest_f. close( )
2.3 操作文件-扩展
"""
扩展: with-open语句:
主要是针对于 文件操作的, 即: 不用手动 close()释放资源了, 该语句会在 语句体执行完毕后, 自动释放资源
格式:
with open('路径', '模式', '码表') as 别名, open('路径', '模式', '码表') as 别名:
语句体
特点:
语句体执行结束后, with后边定义的变量, 会自动被释放
"""
with open ( './data/a.txt' , 'rb' ) as src_f, open ( './data/b.txt' , 'wb' ) as dest_f:
while True :
data = src_f. read( 8192 )
if len ( data) <= 0 :
break
dest_f. write( data)