Python3.5以上新语法的正确使用姿势

开篇: python是一门近年来非常火热的一门编程语言, 同时也有着一个优秀的团队在不停的更新.目前python3也已经进入了第12个版本的迭代中, 本篇文章将通过一些简短的示例 来列举一些比较有意思的语法
依赖: 因某些语法与版本有着强关联关系 推荐使用python3.10及以上

  1. match表达式 (与rust语言中的math表达式效果一致, 与js和golang中的switch效果一致)
def fn(flag: int, condition: bool) -> any:  # python版本需大于等于3.10
    match flag:  # 需要判断的值
        case 1:
        	print("进入了第一个分支")
        case 1 if condition:  # case为关键字 后面跟随的是模式匹配的值, 当值被命中则进入当前分支  若当前分支后跟随路由守卫 需两个条件完全匹配
            print("进入带有路由守卫的条件分支1")
        case 2 if condition is not True:
            print("进入带有路由守卫的条件分支2")
        case _:  # python中 下换线为省略符,代表不获取当前值 模式匹配中,若上方的分支都未被命中 则进入默认分支
            print("进入默认分支")

  1. 海象运算符 大多数作用于判断赋值表达式(简写判断表达式的语句)
def fn(flag: int) -> any:
    number = 0
    if number > flag:
        number += 1
        print(number)
    # 使用海象运算符
    if (number := 0) > flag:
        number += 1
        print(number)

  1. 判断赋值表达式(类似于js和java中的三元表达式)
def fn(flag: int) -> any:
    # 正常表达式
    number = 0
    if number > flag:
        number = flag
    print(number)
    # 判断赋值表达式

    number = flag if number > flag else 0  # 其代表的意思为, number大于flag的时候 number =flag 如果小于 则赋值为0

  1. 推导式+判断表达式
# 列表推导式
def fn() -> list[dict]:
    dataDist = [
        {
            "name": "zhangsan",
            "age": 15
        },
        {
            "name": "李四",
            "age": 17
        },
        {
            "name": "王二麻子",
            "age": 23
        }
    ]

    return [d for d in dataDist if d.get("age") > 16]


print(fn())
# 字典推导式
def fn() -> list[dict]:
    dataDist = [
        {
            "name": "zhangsan",
            "age": 15
        },
        {
            "name": "李四",
            "age": 17
        },
        {
            "name": "王二麻子",
            "age": 23
        }
    ]

    return [{k: v for k, v in d.items() if k == "age" and v > 15} for d in dataDist]


print(fn())
  1. asyncio库 的异步方式使用
# 基本使用
import asyncio

# 关键字 async
async def fn(n: int) -> any:
    for _ in range(n):
        print("fn1")
        await asyncio.sleep(0.1)  # 需阻塞等待让出cpu调度执行权, 不然会报错当前方法未等待


# 异步执行方式
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*[fn(5) for _ in range(2)]))

# 关键字 async
async def fn(n: int) -> any:
    for i in range(n):
        print("fn1")
        await asyncio.sleep(0.1)  # 需阻塞等待让出cpu调度执行权, 不然会报错当前方法未等待
        yield i     # 通过yield关键字实现一个异步生成器 再通过另外一个异步方法进行循环, 这里调用yield其实是隐式的实现了__aiter__和 __anext__


# async for 实现
async def fn1() -> any:
    async for i in fn(10):
        print(i)


# 执行方式
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(fn1()))
# 第三种 async with实现
from typing.io import IO


class WriteZip:

    def __init__(self, path, mode):
        self.path = path
        self.mode = mode
        self.__file: IO = None

    async def __aenter__(self):
        self.__file = open(self.path, mode=self.mode)
        return self.__file

    async def __aexit__(self, exc_type, exc_val, exc_tb):
        self.__file.close()


async def fn(path):
    async with WriteZip(path, "wb+") as f:
        f.write("dd\n")


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