python基本语法知识(三)

函数的相关杂项

例子1:函数多返回值

def test_return():
    return 1, 2, 3

x, y, z = test_return()
print(x) # 1
print(y) # 2
print(z) # 3

例子2:函数参数传递方式

def user_info(name, age, gender):
    print(f"姓名是:{name}, 年龄是:{age}, 性别是:{gender}")

user_info('小明', 20, '男')

# 使用关键字传参可不必遵守位置
user_info(age = 11, name='小王', gender='女')

# 
user_info('甜甜', gender='女', age = 10)

输出:

姓名是:小明, 年龄是:20, 性别是:男

姓名是:小王, 年龄是:11, 性别是:女

姓名是:甜甜, 年龄是:10, 性别是:女

函数默认第一个默认参数后面必须都有默认参数:

# 错误
def user_info(name='', age, gender):
    print(f"姓名是:{name}, 年龄是:{age}, 性别是:{gender}")
# 正确
def user_info1(name, age=0, gender=''):
    print(f"姓名是:{name}, 年龄是:{age}, 性别是:{gender}")

例子3:不定长参数传递

# 不定长的形式参数会作为元组存在,接收不定长数量的参数传入
def user_info(*args):
    print(f"args参数的类型是:{type(args)}, 内容是:{args}")

user_info(1, 2, 3, '小明', '男孩')

# ** 表示不定长参数必须是字典元素(kv)
def user_info(**kwargs):
    print(f"args参数的类型是:{type(kwargs)}, 内容是:{kwargs}")

user_info(name = '小王', age = 22, gender = '男孩')

输出:

args参数的类型是:, 内容是:(1, 2, 3, ‘小明’, ‘男孩’)

args参数的类型是:, 内容是:{‘name’: ‘小王’, ‘age’: 22, ‘gender’: ‘男孩’}

例子4:lambda匿名函数使用

lambda函数最多只能写一行代码

def test_func(compute):
    result = compute(1, 2)
    print(f"结果是:{result}")

# lambda默认把冒号后的表达式返回,匿名函数
test_func(lambda x, y: x + y)

输出:

结果是:3

文件

例子1:文件的读操作

f = open("D:/cplusplus/00个人笔记/python学习/python-learn/测试01.txt", "r", encoding="UTF-8")
print(type(f))

# 读取文件
print(f"读取10个字节的结果是:{f.read(10)}")
# 如果上一次读完后内部指针会进行偏移导致下一次read 从上一次read结尾开始
print(f"读取全部内容的结果是:{f.read()}")

# 读取全部行
lines = f.readlines()
print(f"lines对象类型{type(lines)}")
print(f"lines内容是{lines}")

# 单行读取
line1 = f.readline()
line2 = f.readline()
line3 = f.readline()
print(f"第一行数据:{line1}")
print(f"第二行数据:{line2}")
print(f"第三行数据:{line3}")

# for循环读取文件行
for line in f:
    print(f"每行数据为:{line}")

# 文件关闭
f.close()

# with open 帮助我们在使用文件对象后自动close
with open("D:/cplusplus/00个人笔记/python学习/python-learn/测试01.txt", "r", encoding="UTF-8") as f:
    for line in f:
        print(f"每一行的数据是:{line}")

例子2:文件的写操作 write 和 flush

直接调用write ,只是将内容写到内存缓冲区中,当调用flush时,才会真正写入文件。这样可避免频繁操作硬盘

# 若test.txt不存在则会创建该文件
# 若文件已存在,则会清空内容再写入
f = open("test.txt", "w", encoding="UTF-8")

f.write("hello world22!!")   # 写入到内存中
f.flush()  # 刷盘

f.close() # close 包含了 flush的调用

例子3:

有份账单文件 bill.txt 如下,我们要将其最后一列为正式的行写入新的备份文件 bill.txt.bak

name,date,money,type,remarks
周杰轮,2022-01-01,100000,消费,正式
周杰轮,2022-01-02,300000,收入,正式
周杰轮,2022-01-03,100000,消费,测试
林俊节,2022-01-01,300000,收入,正式
林俊节,2022-01-02,100000,消费,测试
林俊节,2022-01-03,100000,消费,正式
林俊节,2022-01-04,100000,消费,测试
林俊节,2022-01-05,500000,收入,正式
张学油,2022-01-01,100000,消费,正式
张学油,2022-01-02,500000,收入,正式
张学油,2022-01-03,900000,收入,测试
王力鸿,2022-01-01,500000,消费,正式
王力鸿,2022-01-02,300000,消费,测试
王力鸿,2022-01-03,950000,收入,正式
刘德滑,2022-01-01,300000,消费,测试
刘德滑,2022-01-02,100000,消费,正式
刘德滑,2022-01-03,300000,消费,正式

实现代码

# 打开读取文件的对象
fr = open("bill.txt", "r", encoding="UTF-8")

# 打开写入文件的对象
fw = open("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()

异常

例子1:捕获所有异常

try:
    # 1/0 # 这是 ZeroDivisionError 异常,不会捕获,直接出错终止程序
    print(name)
# 捕获NameError异常,别的异常不会捕获
except NameError as e:
    print("出现了变量未定义异常")
    print(e)

输出:
出现了变量未定义异常
name ‘name’ is not defined

例子3:捕获多个异常

# 捕获多个异常
try:
    1/0
    print(name)
# 捕获NameError异常,别的异常不会捕获
except (NameError, ZeroDivisionError) as e:
    print("出现了变量未定义异常")
    print(e)

例子4:finally和else

finally 不管有没有异常都执行,else 是不发生异常时执行,是可选项

try:
    f = open("aa.txt", "r", encoding="UTF-8")
except Exception as e:
    print("文件不存在,改为w模式打开")
    f = open("aa.txt", "w", encoding="UTF-8")
else:
    print("没异常")
finally:
    print("有没有异常都要执行")
    f.close()

你可能感兴趣的:(python,python,开发语言)