Python学习20230222

# python函数进阶
# 函数的多返回值
# 如果一个函数要有多个返回值,该如何书写代码
"""
def test_return():
    return 1,2

x,y = test_return()
print(x)
print(y)

按照返回值的顺序,写对应顺序的多个变量接收即可
变量之间用逗号隔开
支持不同类型的数据return
"""
def test_return():
    return 1, "hello", True
x, y, z = test_return()
print(x)
print(y)
print(z)

# 函数多种传参方式
# 函数参数种类:
# 位置参数: 调用函数时使用函数定义的参数位置来传递参数(传递的参数和定义的参数的顺序及个数必须一致)
# 关键字参数: 函数调用的时通过“键=值”形式传递参数,可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求
#     函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序
# 缺省参数: 缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可以不传该默认参数的值
#    (注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)
#     当调用函数时没有传递参数,就会默认使用缺省参数对应的值 
#     函数调用时,如果为缺省参数传值则修改默认参数值,否则使用这个默认值
# 不定长参数: 不定长参数也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也可以)的场景
#     当调用函数时不确定参数个数时,可以使用不定长参数
#   不定长参数的类型:
#       位置传递:传进的所有参数都会被 *args变量收集,他会根据传进参数的位置合并为一个元组,args是元组类型,这就是位置传递
#       关键字传递:参数是**kwargs,参数是“键=值”形式的状况下,所有的“键=值”都会被kwargs接受,同时会根据“键=值”组成字典
def user_info(name, age, gender):
    print(f"姓名是: {name}, 年龄是: {age}, 性别是: {gender}")
# 位置参数
user_info('小明', 20, '男')
# 关键字参数
user_info(name = '小智', age = 22, gender = '男')
user_info(gender = '女',name = '潇潇', age = 10)
user_info('甜甜', gender = '女',age = 5)
# 缺省参数
def user_info(name, age, gender='男'):
    # 默认值必须从后往前依次赋值,若最后一位没有设置默认值,那么倒数第二位是不能设置默认值的
    print(f"姓名是: {name}, 年龄是: {age}, 性别是: {gender}")
user_info('小天', 13)
user_info('小天', 13,'女')
# 位置不定长
def user_info(*args):
    print(f"args参数的类型是: {type(args)}, 内容是: {args}")
user_info('小明', 20, '男')
# 关键字不定长
def user_info(**kwargs):
    print(f"args参数的类型是: {type(kwargs)}, 内容是: {kwargs}")
user_info(name = '小智', age = 22, gender = '男')


# 函数作为参数传递
"""
def test_func(compute):
    result = compute(1, 2)
    print(result)

def compute(x, y)
    return x + y

test_func(compute)

函数compute作为参数,传入test_func函数中使用
· test_func需要一个函数作为参数传入,这个函数需要接收2个数字进行计算,计算逻辑由这个被传入的函数决定
· compute函数接收2个数字对其进行计算,compute函数作为参数,传递给test_func函数使用
· 最终,在test_func函数内部,由传入的compute函数,完成了对数字的计算操作

所以这是一种,计算逻辑的传递,而非数据的传递
就像上述代码一样,不仅仅是相加、相减、相除,任何逻辑都可以自行定义并作为函数传入
"""
def test_func(compute):
    result = compute(1,2)
    print(type(compute))
    print(result)

def compute(x,y):
    return x + y

test_func(compute)


# lambda匿名函数
"""
函数的定义中
· def关键字,可以定义带有名称的函数
· lambda关键字,可以定义匿名函数(无名称)
有名称的函数,可以基于名称重复使用
无名称的匿名函数,只可临时使用一次

匿名函数定义语法:
lambda 传入参数:函数体(一行代码)
· lambda是关键字,表示定义匿名函数
· 传入参数表示匿名函数的形式参数,如:x,y表示接收两个形式参数
· 函数体,就是函数的执行逻辑,要注意:只能写一行,无法写多行代码
"""
# lambda 传入参数: 函数体(一行代码)
test_func(lambda x , y: x + y)
# 使用def和lambda,定义的函数功能完全一致,只是lambda关键字定义的函数是匿名的,无法二次使用


# ========================================================================
# 文件操作
# 文件的编码
# 文本文件会使用编码技术将内容翻译成0和1
# Python使用的是UTF-8格式编码

# 文件的读取
"""
计算机对文件的操作步骤(文件操作三步走)
1.打开文件
2.读写文件
3.关闭文件
可以只打开和关闭文件不进行任何读写
"""
# Python使用open()函数,打开一个已经存在的文件或者创建一个新文件
"""
open(name,mode,encoding)
name: 是要打开的目标文件名的字符串(可以包含文件所在的具体路径)
mode: 设置打开文件的模式(访问模式):只读、写入、追加等
encoding: 编码格式(推荐使用UTF-8)

f = open('python.txt','r',encoding="UTF-8")
encoding的顺序在函数中不是第三位,所以不能用位置参数,用关键字参数直接指定

r: 以只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式
w: 打开一个文件只用于写入。如果该文件已存在则打开文件,并从头开始编辑,原有内容会被删除。
   如果该文件不存在,创建新文件
a: 打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后
   如果该文件不存在,创建新文件进行写入
"""
f = open("E:\测试.txt","r", encoding="UTF-8")
print(type(f))

"""
read()方法
文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节)
如果没有传入num,那么就表示读取文件中所有的数据

readlines()方法
readlines可以按照行的方式把整个文件中的内容进行一次性读取
并且返回的是一个列表,其中每一行的数据为一个元素
f = open('python.txt')
content = f.readlines()
# ['hello woeld\n','abcdefg\n','aaa\n','bbb\n','ccc']
print(content)
# 关闭文件
f.close

readline()方法
一次读取一行内容
f = open('python.txt')
# ['hello woeld\n','abcdefg\n','aaa\n','bbb\n','ccc']
content = f.readline()
print(content)
content = f.readline()
print(content)
# 关闭文件
f.close
"""
print(f.read(10))
print(f.read())
# 连续使用两次read时,第二次read会从上一次read读到的地方开始读取
print("---------------------------------------------------")
lines = f.readlines()
print(f"{type(lines)}, {lines}")
# readlines也会从上一次read读到的地方读取
line = f.readline()
print(f"{type(line)}, {line}")
line = f.readline()
print(f"{type(line)}, {line}")
# readline也会从上一次read、readlines等读到的地方读取

# for循环读取文件行
for line in open("E:\测试.txt","r", encoding="UTF-8"):
    print(line)
    # 每一个line临时变量,就记录了文件的一行数据

# 关闭文件
f.close()
# 最后通过close关闭文件对象,也就是关闭对文件的占用
# 如果不调用close,同时程序没有停止运行,那么这个文件将一直被Python程序占用

"""
with open("python.txt","r") as f:
    f.readlines()
    
通过在with open的语句块中对文件进行操作
可以在操作完成后自动关闭close文件,避免遗忘close方法
"""
with open("E:\测试.txt","r",encoding = "UTF-8") as f:
    for line in f:
        print(f"每一行的数据为: {line}")

# 小练习
"""
将以下文本存入word.txt
itheima itcast python
itheima python itcast
beijing shanghai itheima
shenzhen guangzhou itheima
wuhan hangzhou itheima
zhengzhou bigdata itheima
读取此文件,统计itheima出现的次数
"""
f = open("E:\word.txt","r",encoding = "UTF-8")
content = f.read()
count = content.count("itheima")
print(f"itheima出现的次数为: {count}")
f.close()

count = 0
f = open("E:\word.txt","r",encoding = "UTF-8")
for line in f:
    line = line.strip() # 去除开头和结尾的空格以及换行符
    words = line.split()
    print(words)
    for word in words:
        if word == "itheima":
            count += 1
print(f"itheima出现的次数为: {count}")
f.close()

with open("E:\word.txt","r",encoding = "UTF-8") as f:
    count = 0
    for line in f:
        print(f"每一行的数据为: {line}")
        l = line.split()
        for element in l:
            if(element == "itheima"):
                count += 1
    print(f"itheima出现的次数为: {count}")

# 文件的写入
"""
1.打开文件
f = open("python.txt","w")
2.文件写入
f.write("hello world")
3.内容刷新
f.flush

直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
当调用flush的时候,内容会真正写入文件
这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
"""
f = open("E:\\test.txt","w",encoding = "UTF-8")
# w模式下,若文件不存在会创建新文件
f.write("hello world!!!")
f.flush()
f.close()   # close内置了flush功能

f = open("E:\\test.txt","w",encoding = "UTF-8")
# w模式下,若文件存在会将原来内容覆盖
f.write("itheima")
f.flush()
f.close()

# 文件的追加
"""
1.打开文件
f = open("python.txt","a")
2.文件写入
f.write("hello world")
3.内容刷新
f.flush

a模式,文件不存在会创建文件
a模式,文件存在会在最后,追加写入文件
"""
f = open("E:\\test.txt","a",encoding = "UTF-8")
f.write("hello world!!!")
f.flush()
f.close()

# 完成文件备份案例
"""
需求分析
有一份账单内容如下:
name,date,money,type,remarks
周婕纶,2022-01-01,10000,消费,正式
周婕纶,2022-01-02,30000,收入,正式
周婕纶,2022-01-03,10000,消费,测试
林俊节,2022-01-01,30000,消费,正式
林俊节,2022-01-02,10000,收入,测试
林俊节,2022-01-03,10000,消费,正式
林俊节,2022-01-04,10000,收入,测试
林俊节,2022-01-05,50000,消费,正式
张雪有,2022-01-01,90000,消费,正式
张雪有,2022-01-02,50000,收入,正式
张雪有,2022-01-03,95000,收入,测试
王立红,2022-01-01,10000,收入,正式
王立红,2022-01-02,30000,消费,测试
王立红,2022-01-03,10000,消费,正式
刘德桦,2022-01-01,10000,收入,测试
刘德桦,2022-01-02,30000,消费,正式
刘德桦,2022-01-03,10000,消费,正式

将内容复制并保存到bill.txt文件中,标记为测试的数据行丢弃
"""
data = []
inFile = open("E:\HW.txt","r",encoding = "UTF-8")
for lines in inFile:
    if lines.count("测试") == 0:
        data.append(lines)
print(data)
inFile.close()
outFile = open("E:\\bill.txt","w",encoding = "UTF-8")
for x in data:
    outFile.write(x)
outFile.close()

# 优化
fr = open("E:/bill.txt","r",encoding = "UTF-8")
fw = open("E:/bill.txt.bak","w",encoding = "UTF-8")
for line in fr:
    line = line.strip()
    if line.split(",")[4] == "测试":
        continue    # 跳出本次循环,不执行后续操作
    fw.write(line)
    # 由于前面进行了strip操作,所以要手动的写出换行符
    fw.write("\n")
fr.close()
fw.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有只小白叫岳飒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值