Python技术手册 · 函数的多返回值&文件操作

目录

​函数的多返回值&文件操作

​函数的多返回值

​多返回值返回方式

​函数的传参方式(以不同的使用方式分类)

位置参数

关键字参数

缺省参数

不定长参数

​匿名函数(lambda)

​函数作为参数

​文件操作

​编辑文件的编码

​编辑文件的打开&读取

​编辑文件的写入

​编辑文件的关闭

​写在最后


函数的多返回值&文件操作

函数的多返回值

  • 概念&作用:同一函数同时返回多个返回值

返回误区

  • 在同一个函数中,return函数在给函数返回一个结果的同时会自动退出当前函数
  • 故在函数中第一个return函数下的任何内容都将不属于当前函数
  • 故不可以通过同一函数描写多个return句式来达到同时返回多个返回值的目的
#函数的多返回值
#返回值误区 实例如下:
def text_func():#定义函数
    return 1
    return 2

text_result = text_func()#引用函数
print(text_result)#输出

#输出结果:1
#return函数在给函数返回一个结果的同时会退出当前函数
#故函数中第一个return下的任何函数都不属于当前函数
#故不可以通过在同一函数中描写多个rerun句式来达到同时返回多个返回值的目的

多返回值返回方式

  • 按照返回值的顺序,写对应顺序的多个变量接受即可
  • 变量之间用逗号隔开,支持不同类型的数据拼接return
#实现同时返回多个返回值 实例如下:
def text_func_1():#定义函数
    return 1,"fortune"

text_result_1 = text_func_1()#引用函数(方式一)
print(text_result_1)#输出

result1,result2 = text_func_1()#引用函数(方式二)
print(result1,result2)#输出

# 输出结果:(1,2)
# 输出结果:1 2
# 按照返回值的顺序,写对应顺序的多个变量接受即可
# 变量之间用逗号隔开,支持不同类型的数据拼接return

函数的传参方式(以不同的使用方式分类)

位置参数

  • 概念:调用函数时根据函数定义的参数位置来传递参数
  • 注意事项:传递的参数和定义的参数的顺序及个数必须一致,但传入参数可以是不同类型
# 位置参数
def text_fun_loc(loc_1,loc_2,loc_3): # 函数定义(位置传参) 定义3个形参
    print(f"位置参数举例:1:{loc_1} 2:{loc_2} 3:{loc_3}") #输出
text_fun_loc_result = text_fun_loc(0.5,"fortune",1>2) # 传入符合定义数量(3)的参数

text_fun_loc_result_1 = text_fun_loc(0.5,"fortune",1>2,'a')# 传入不符合定义数量(4)的参数

# 输出结果:
# Traceback (most recent call last):
#   File "C:\Users\86186\Desktop\PCP\text.py", line 35, in <module>
#     text_fun_loc_result_1 = text_fun_loc(0.5,"fortune",1>2,'a')# 传入不符合定义数量的参数
# TypeError: text_fun_loc() takes 3 positional arguments but 4 were given
# 以上为传入4个参数的出错结果(非输出结果)
# 以下为传入3个参数的正确结果(非输出结果)
# 位置函数举例:1:0.5 2:fortune 3:False

关键字参数

  • 概念&作用:函数调用时通过“键对值(键=值)”的形式传递参数 · 清除参数的顺序需求
  • 注意事项:函数调用时,如果有位置参数时,其必须在关键字参数之前且匹配形参顺序,但关键字参数之间无先后顺序
# 关键字参数
def text_func_key(key1,key2,key3): # 函数定义(关键字传参)定义3个形参
    print(f"关键字参数举例:1:{key1} 2:{key2} 3:{key3}") # 输出

text_func_key_result = text_func_key(key1 = 0.5,key2 = "fortune",key3 = 1>2) # 顺序传参
text_func_key_result_1 = text_func_key(key2 = "fortune",key3 = 1>2,key1 = 0.5) # 乱序传参
text_func_key_result_2 = text_func_key(0.5,key2 = "fortune",key3 = 1>2) # 与位置传参混用

# 输出结果:
# 关键字参数举例:1:0.5 2:fortune 3:False
# 关键字参数举例:1:0.5 2:fortune 3:False
# 关键字参数举例:1:0.5 2:fortune 3:False
# 关键字传参可以乱序传入参数
# 关键字传参与位置传参混用时,位置参数必须位于关键字参数之前且其匹配与形参的顺序

缺省参数

  • 概念&作用:别名默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值,当调用函数时没有传递参数,就会使用默认或者缺省参数对应的值
  • 注意事项:位置参数必须出现在默认参数之前,包括定义和调用;调用函数时,如果为缺省参数传值则会修改默认参数值,否则使用当前默认值
# 缺省参数
def text_func_def(def1,def2,def3 = 1>2): # 函数定义(缺省传参)定义3个形参
    print(f"缺省参数举例:1:{def1} 2:{def2} 3:{def3}") # 输出

text_func_def_result = text_func_def(0.5,"fortune") # def3未传入参数 则调用默认参数
text_func_def_result_1 = text_func_def(0.5,"fortune",1<2) # def3传入参数 则覆盖默认参数

# 输出结果:
# 缺省参数举例:1:0.5 2:fortune 3:False
# 缺省参数举例:1:0.5 2:fortune 3:True
# 函数调用时,若未传入参数,则调用默认参数值,否则覆盖默认参数值输出传入参数值
# 位置参数的定义与调用必须出现于缺省参数之前

不定长参数

  • 概念&作用:不定长参数及可变参数,用于不确定调用的时候会传递多少个参数(包括不传参)的场景,当调用函数时不确定参数个数时,可以用不定长参数
  • 注意事项:在不定长参数中,不论是位置传递的*args还是关键字传递的**kwargs,只有*或**是唯一不可变的,args或kwargs不过是习惯上无特殊情况即如此定义的两个名称,是可以更改的

不定长参数(位置传递)

  • 注意事项:传进的所有参数都会被args变量收集,其会根据传进参数的位置合并为一个元组(tuple),args是元组类型,此及不定长参数的位置传参
# 不定长参数
# 位置传递
def text_func_loc_idm(*args): # 函数定义(不定义传参——位置传递)定义任意个形参
    print(f"位置传递的内容为:{args} 其类型为:{type(args)}") # 输出

text_func_loc_idm_result = text_func_loc_idm(0.5,"fortune",1>2) # 传入3个参数
text_func_loc_idm_result_1 = text_func_loc_idm(0.5,"fortune") # 传入2个参数

# 输出结果:
# 位置传递的内容为:(0.5, 'fortune', False) 其类型为:<class 'tuple'>
# 位置传递的内容为:(0.5, 'fortune') 其类型为:<class 'tuple'>
# 传进的所有参数都会被args变量收集,其会根据传入的参数的位置合并为一个元组(tuple)
# args是元组(tuple)类型,此及不定长参数的位置传递

不定长参数(关键字传递)

  • 注意事项:传进的所有参数都会被kwargs变量收集,其会根据传进参数的位置合并为一个字典(dict),kwargs是元组类型,此及不定长参数的关键字传参
# 不定长参数
# 关键字传递
def text_func_key_idm(**kwargs): # 函数定义(不定义传参——关键字传递)定义任意个形参
    print(f"位置传递的内容为:{kwargs} 其类型为:{type(kwargs)}")

text_func_key_idm_result = text_func_key_idm( num = 0.5, name = "fortune", yon = 1>2) # 传入3个参数
text_func_key_idm_result_1 = text_func_key_idm( num = 0.5) # 传入1个参数

# 输出结果:
# 位置传递的内容为:{'num': 0.5, 'name': 'fortune', 'yon': False} 其类型为:<class 'dict'>
# 位置传递的内容为:{'num': 0.5} 其类型为:<class 'dict'>
# 参数是“键 = 值”的形式下,所有键值对都会被kwargs接受,同时根据“键 = 值”组成字典

匿名函数(lambda)

  • 概念&作用:定义匿名函数即函数无名称,有名称的函数可以反复使用,但是匿名函数只可临时使用一次,适用于函数在整个工程中无需反复出现的情况,方便快捷
  • 语法:lambda 传参 :函数体
  • 注意事项:匿名函数中函数体只可以写一行
#匿名函数(lambda):
def text_func_lambda(text_lambda): # 定义主函数体
    text_func_lambda_result = text_lambda(1,2)
    print(text_func_lambda_result) # 输出

text_func_lambda(lambda x,y : x+y) # 定义lambda函数并将其传入

# 输出结果:
# 3
# 语法:lambda 传参 :函数体(最多一行)

函数作为参数

  • 概念&作用&注意事项:函数作为参数使用即将一个函数作为形参填入另外一个函数,需要注意的是,函数作为参数时所传递的内容为逻辑传递而非固定的数据传递,相同的数据不同的逻辑其传入函数的结果也不相同
     

文件操作

文件的编码

  • 概念&作用:编码是一种规则集合,记录内容与二进制间进行相互转换的逻辑,编码有多钟,最常用的是UTF-8
  • 通过编码转换来实现文字内容与二进制之间的转换,方便作者与计算机交流 (人类读字,计算机读01)
  • 计算机中可用的编码有UTF-8(当前主流)、GBK(之前中文体系主流)、BIG5(之前繁体字主流)等

文件的打开&读取

  • 打开:open(name,mode,encoding)
  • 解释:name:将打开目标文件名的字符串(包含文件所在的具体路径)
  •            mode:设置打开文件的模式(访问模式):只读,写入,追加等
  •            encoding:编码格式(UTF-8 GBK BIG5等)
  • 读取操作
  • read()函数
  • 读取文件中的字节(内容),可在括号中填写要读取的字节数
# 文件打开
f = open("C:/Users/86186/Desktop/PCP/ile.txt" , "r" , encoding = "UTF-8")

# read()函数
show_1 = f.read(11) # 指定读取文件中的字节个数 例中为11个
show_2 = f.read()
# 当之前有代码读取文件字节时,再次使用read函数将会承接之前的进度继续读取 否则全部读取
print(f"读取11个字节:{show_1}")
print(f"读取全部字节:{show_2}")

# 输出结果:
# 读取11个字节:hello world
# 读取全部字节:
# my name is fortune
# nice to meet you
  • readline()函数
  • 读取文件中一行的字节(内容)
# 文件打开
f = open("C:/Users/86186/Desktop/PCP/ile.txt" , "r" , encoding = "UTF-8")

# readline()函数
show_4 = f.readline()
print(f"读取一行字节:{show_4}")
show_5 = f.readline()
print(f"读取第二行字节:{show_5}")
# 输出结果:
# 读取一行字节:hello world
#
# 读取第二行字节:my name is fortune
# readline函数作用为读取文件中的一行字节(内容)
  • readlines()函数
  • 读取文件中全部行的字节(内容)
# 文件打开
f = open("C:/Users/86186/Desktop/PCP/ile.txt" , "r" , encoding = "UTF-8")

# readlines()函数
show_3 = f.readlines()
print(f" readlines函数下其输出内容:\n {show_3} \n 其数据类型:{type(show_3)}")

# 输出结果:
# readlines函数下其输出内容:
# ['hello world\n', 'my name is fortune\n', 'nice to meet you']
# 其数据类型: <class 'list'>
# readlines 函数会将文件的全部行封装到列表中
  • 注意事项:
  • 使用read或readline函数时,若之前有代码读取文件字节,则再次使用read或readline函数将会承接之前的进度继续读取,否则全部读取
  • 使用readlines函数时,函数会将文件的全部行封装在列表中

文件的写入

  • 操作&语法:write()函数 打开文件 open函数 'w'模式
  • 文件的追加:
  • 操作&语法:write()函数 打开文件 open函数 'a'模式
  • 注意事项:
  • 直接调用write函数,内容并非直接写入文件,而是会暂存在程序的内存中,即缓冲区
  • 当调用flush函数时,内容会被写入文件,其目的在于避免频繁的操作磁盘以导致效率下降
# 文件打开
f = open("C:/Users/86186/Desktop/PCP/ile.txt" , "w" , encoding = "UTF-8") # 可写模式
f = open("C:/Users/86186/Desktop/PCP/ile.txt" , "a" , encoding = "UTF-8") # 追加模式

# 文件的写入
# write()函数
f.write("text_")
f.flush()

# 直接调用write函数,内容并非直接写入文件,而是会暂存在程序的内存中,即缓冲区
# 当调用flush函数时,内容会被写入文件,其目的在于避免频繁的操作磁盘以导致效率下降

文件的关闭

  • 操作&语法:close()函数
  • 注意事项:如果不调用close,同时程序没有停止运行,则此文件将会一直被Python程序占用
  • 操作&语法:with open语法
  • 注意事项:通过with open的语句块对文件进行操作可以在操作完成后自动关闭文件(即close功能)
  • 避免遗忘close而导致Python程序一直占用文件的问题
# 文件打开
f = open("C:/Users/86186/Desktop/PCP/ile.txt" , "r" , encoding = "UTF-8")

# 文件的关闭
f.close()
# 如果不调用close,同时程序没有停止运行,则此文件将会一直被Python程序占用

# with open语法
# with open("C:/Users/86186/Desktop/PCP/ile.txt" , "r" , encoding = "UTF-8") as f:
#     f.read()
# 通过with open的语句块对文件进行操作可以在操作完成后自动关闭文件(即close功能)
# 避免遗忘close而导致Python程序一直占用文件的问题

写在最后

如有错误欢迎私聊或评论区指出

一些浅显的看法和知识点汇总 内容引用有黑马课程中的部分内容

视频链接(传送门):

 《2022新版黑马程序员python教程,8天python从入门到精通,学python看这套就够了》

函数的多返回值:

https://www.bilibili.com/video/BV1qW4y1a7fU?p=81&vd_source=77f607110a61793619d53eda630e2057

文件编码操作:

https://www.bilibili.com/video/BV1qW4y1a7fU?p=85&vd_source=77f607110a61793619d53eda630e2057

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中,可以使用多线程来实现并发执行任务。然而,由于全局解释器锁(GIL)的存在,Python的多线程并不能真正实现多核并行处理,但可以在IO密集型任务中提高效率。 要获取函数返回值,可以使用以下几种方法: 1. 使用`threading.Thread`类创建线程,并通过`join()`方法等待线程执行完毕,然后通过线程对象的属性获取返回值。 ```python import threading def my_function(): # 执行一些任务 return result # 创建线程 my_thread = threading.Thread(target=my_function) # 启动线程 my_thread.start() # 等待线程执行完毕 my_thread.join() # 获取返回值 result = my_thread.result ``` 2. 使用`concurrent.futures`模块中的`ThreadPoolExecutor`类来管理线程池,并通过`submit()`方法提交任务,然后使用`result()`方法获取返回值。 ```python from concurrent.futures import ThreadPoolExecutor def my_function(): # 执行一些任务 return result # 创建线程池 executor = ThreadPoolExecutor() # 提交任务并获取Future对象 future = executor.submit(my_function) # 获取返回值 result = future.result() ``` 3. 使用`queue.Queue`类来在主线程和子线程之间传递数据,将函数返回值放入队列中,在主线程中获取返回值。 ```python import threading import queue def my_function(queue): # 执行一些任务 result = ... # 将结果放入队列 queue.put(result) # 创建队列 result_queue = queue.Queue() # 创建线程 my_thread = threading.Thread(target=my_function, args=(result_queue,)) # 启动线程 my_thread.start() # 获取返回值 result = result_queue.get() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文豪野橘Sam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值