python进阶语法学习笔记

各类推导式

# 列表推导式
# 列表推导式是python中一种独特的数据处理方式,用于过滤和转换数据
# 格式:[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
# 列表推导式中存在两个名词,列表和推导式(解析式)
# 返回值是列表
# 列表推导式中定义的都是局部变量

# 实例1
# 通过for循环编写
my_list = [1, 2, 3]
new_list = []
for i in my_list:
    new_list.append(i * 2)
print(new_list)
# 通过列表推导式编写
n_list = [i * 2 for i in my_list]
print(n_list)
# 在推导式中加入if
nn_list = [i * 2 for i in my_list if i > 1]
print(nn_list)
# 优化两层for循环(列表推导式支持两层for循环)----按照需求可以无限套娃
nnn_list = [(x, y) for x in range(3) for y in range(3)]
print(nnn_list)
nnn_list1 = [(x, y) for x in range(3) for y in range(3) if y > 1 and x > 1]
print(nnn_list1)
# 嵌套结构的列表推导式
nnn_list2 = [y * 4 for y in [x * 2 for x in range(3)]]
# 作用1:用于数据转换
nnn_list3 = [x * 2 for x in my_list]  # 将原数据中的值翻倍
# 作用2:用于数据筛选
nnn_list4 = [x for x in my_list if x > 1]  # 将原数据中小于1的过滤

# 字典推导式
# 格式:{键:值 for 迭代变量 in 可迭代对象 [if 条件表达式]}

# 作用1:通过递归创建字典
my_dic = {key: value for key in range(3) for value in range(4)}
print(my_dic)  # 此时需要注意的是字典中不能出现同名的 key,第二次出现就把第一个值覆盖掉

# 作用2:遍历一个具有键值关系的可迭代对象(将其转换为字典)
my_tuple_list = [('name', '橡皮擦'), ('age', 18), ('class', 'no1'), ('like', 'python')]
my_dic1 = {key: value for key, value in my_tuple_list}
print(my_dic1)

# 元组推导式(生成器语法,产生的对象是一个生成器对象)
my_tuple = (i for i in range(3))
print(my_tuple)

# 集合推导式
my_set = {value for value in 'hellowworld'}
print(my_set)

三元表达式

# 三元表达式
# python中没有其他语言的三元表达式相关说法,但是有类似的语法,在python中,三元表达式是一种语法结构,一般被python开发者叫做条件表达式
# 结构:表达式(1)为True执行语句 if条件表达式(1) else 表达式(1)为False执行语句

# 作用1:简化if语句
age = 20
cv = '成年' if age > 18 else '未成年'
print(cv)
# 作用2:返回多个条语句
cv1 = '成年', '大于18' if age >= 18 else '小屁孩'
print(cv1)  # 返回对象是一个元组,中间用逗号隔开


# 进阶1:在函数内部使用三元表达式
def demo(num):
    return True if num % 2 == 0 else False


if demo(2):
    print('您输入的是一个2的倍数')

# 进阶2:三元表达式用于列表递推式
li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
new_list = [i if i % 2 == 0 else None for i in li]
print(new_list)  # 将原列表中奇数替换为None

# 进阶3:三元表达式与lambda(匿名函数)
max = lambda a, b: a if a > b else b
r = max(10, 18)
print(r)

# 练习题:使用三元组表达式统计偶数个数
pi = [3, 14, 15, 9, 26, 5, 35, 8, 97, 932]
x = 0
num = [x for x in pi if x%2 == 0]
print(len(num))

断言

# 断言
# Python 断言,即 Python assert 语句,简单理解就是简易版的 if 语句,
# 用于判断某个表达式的值,结果为 True,程序运行,否则,程序停止运行,抛出 AssertionError 错误。
# 格式:assert 表达式

# 案例:在游戏中是指一个18禁的功能
def demo(age):
    assert age >= 18, "对不起你进步来"
    print("玩得开心")


# 应用:断言是为了告知 开发人员 ,你写的程序发生异常
def some():
    my_list = []
    return my_list


def func():
    ret = some()
    assert len(ret) == 18, "列表元素数量不对"
# 不要用断言验证用户的输入,这是因为 python 通过命令行运行时,如果增加 -O 标识,断言就被全局禁止了,你的所有验证就都丢失了。

上下文管理器

# 背景
# 文件操作、数据库操作都需要在程序执行完毕进行清理工作
# 很多时候我们经常忘记手动关闭
# 因此python集成了一种自动操作,例如文件使用后自动释放资源
# with as 被称为上下文管理器,在python中实现自动分配并释放资源
# 结构:with 表达式 [as 指定一个变量名]:
# 其中[]中的内容可以省略,如果使用表示将前文表达式的结果保存到一个变量中

# 案例:文档操作
# 在不使用上线文管理器的时候
file = open(r'')
data = file.read()
file.close()
# 使用上下文管理器的时候
with open(r'') as file:
    data = file.read()


异常捕捉

# 异常捕获
# 程序异常,就是bug,在python中通过try,except来捕捉
# 这样可以避免程序被强制终止


# 案例
num = 20
num1 = 0
try:
    nun = num / num1
except ZeroDivisionError:
    print("除数不能为0")
# 在 except 后面是异常对象,该异常对象我们设置为 ZeroDivisionError 这是因为已经知道是会出现这个异常,如果在编码过程中不知道会出现哪种异常,依旧会出现错误。
num2 = 'abv'
try:
    nsaa = num / num2
except TypeError:
    print('类型错误')
# 该种写法在书写的时候需要预先知道会提示哪种异常,如果异常不清楚那可以省略异常对象,直接使用下述代码即可。
try:
    nsaa = num / num2
except:
    print('错误')

# try except else语句
# 在 try … except 语句后面可以增加一个 else 语句,该语句表示的含义可以按照如下描述进行理解,当出现异常的时候执行 except 语句中的代码,当无异常执行 else 语句代码。
num1 = 20
num2 = 1
try:
    num3 = num1 / num2
except ZeroDivisionError:
    print("除数不可以为 0 ")

except TypeError:
    print("除数类型不对")

else:
    print("无异常,会被执行")


# try … except 语句还可以和 finally 语句配合
# finally 语法需要与 try 语句配合使用,无论是否有异常出现都会执行该语句内容
num1 = 20
num2 = 1
try:
    num3 = num1 / num2
except ZeroDivisionError:
    print("除数不可以为 0 ")

except TypeError:
    print("除数类型不对")

else:
    print("无异常,会被执行")
finally:
    print('最终会被执行')

字符串对象方法

# 字符串对象的方法
# 在python中有个说法就是万物皆可对象,字符串也有一些内置方法
my_str = "abcd"
a = my_str.find('糖')  # 返回位置
new_my_str = my_str.title()  # 首字母大写
new_my_str1 = my_str.upper()  # 所有大写
new_my_str2 = my_str.lower()  # 所有小写
new_my_str3 = my_str.count('a')  # 计数

lamdba

# lambda 匿名函数
# 定义他的时候,没有具体的名称,一般用来快速定义单行函数
# 表达式lambda[参数列表]:表达式
fun = lambda x: x + 1
# 作用1:降低代码的可读性
print((lambda x: x + 1)(1))
# 作用2:将lambda表达式赋值给一个变量,然后调用变量
func = lambda a: a ** 2
print(func(2))
# 作用3:将lambda赋值给其它函数,从而替换函数功能
# 一般这种情况是为了屏蔽一些功能,例如屏蔽内置函数
sorted = lambda *args: None
x = sorted([3, 2, 1])
print(x)
# 作用4:将lamdba表达式作为参数传个其他函数
my_list = [(1, 2), (3, 1), (4, 0), (11, 4)]
my_list.sort(key=lambda x: x[1])
# my_list 变量调用 sort 函数,参数 key 赋值了一个 lambda 表达式,
# 该式子表示依据列表中每个元素的第二项进行排序。
print(my_list)


# 作用5:将lambda表达式应用到filter\map\reduce高阶函数中
# 作用6:将lambda表达式应用在函数的返回值里面(闭包(Closure)编程)
def funq(n):
    return lambda x: x + n


new_func = funq(10)
print(new_func(110))

python路径问题

# python的路径问题
# 相对路径:‘.’表示当前文件夹‘..’表示上层文件夹
import os

print(os.getcwd())  # 获取当前绝对路径
# abspath 方法需要一个参数 path,即一个路径,基于该路径在返回绝对路径。
# 例如通过该代码返回 当前目录指定文件的绝对路径
ret = os.path.relpath(r"C:\\")
print(ret)

# 路径检查方法
# exists(path) 如果 path 文件或文件夹存在返回 True,否则返回 False;
# isabs(path) path 是绝对路径返回 True,否则返回 False;
# isdir(path) path 是文件夹返回 True,否则你懂;
# isfile(path) path 是文件返回 True。

# 目录操作
# mkdir(path) 创建目录;
# rmdir(path) 删除目录;
# chdir(path) 切换当前工作目录到 path;
# remove(path) 删除文件,注意如果 path 是一个目录,删除会报错,权限不足,删除目录请使用 rmdir。

# 获取文件大小 os.path.getsize()
# 获取指定目录下面的所有内容 os.lsitdir()

# 读取文件
file = r''
f = open(file, encoding='utf-8')
read_str = f.read()
f.close()

# 逐行读取文件内容
f = open(file, encoding='utf-8')
for line in f:
    print(line, end='')
data = f.readlines()  # 封装好的逐行读取
f.close()

# with上下文
# with open(待打开文件) as 文件对象:
#      文件操作代码块
file = r''
with open(file, encoding='utf-8') as f:
    read_is = f.read()
    print(read_is)

# 写入文件
# 文件对象.write(待写入内容)
# 文件地址,注意提前在当前目录新建一个 test.txt 文件
file = "test.txt"
# 打开文件
with open(file, mode="w", encoding="utf-8") as f:
    # 写入文件内容
    f.write("我是即将被写入的内容")


# 文件复制
# 使用该模块中 shutil 对象的 copy 方法可以对文件进行复制操作
# shutil.copy(旧文件,新文件)

# 目录复制
# copytree 方法语法格式与 copy 一致,只不过该方法是用来复制目录的,如果目录下面有子目录或文件一起复制。

# shutil.move(旧文件,新文件)
# 移动文件一定要确保旧文件存在,移动之后旧文件将移动到新文件位置。
# 使用 move 方法可以修改文件名,在移动文件的过程中,如果新旧文件名称不一致,可实现移动文件并重命名的效果。
# 使用 move 方法还可以移动目录,移动目录时会将该目录下的所有文件一起移动。当然如果新旧目录名称不一致,还可以实现移动目录并重命名的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

RuiXuan Zhang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值