python新特性

字符串格式化输出

字符串格式化输出

formatted字符串是带有'f'字符前缀的字符串,可以很方便的格式化字符串

#旧版本
name = '泉信 '
print('公司是: %s'%name)
print('公司是: {}'.format(name))
#新版本
print(f'欢迎加入: {name}')
languages = ['Python','JAVA']
print(f'课程包含:{languages[0]},{languages[1]} 等多种开发技术 ')
#格式化字符串字面值(formatted string literal),可以在字符串常量内使用嵌入的Python表达 式。
a = 5
b = 10
print(f'表达式运算的结果: {2*(a+b)}')

formatted字符串支持 =

user = '泉信'
info = f'{user=}'
print(info) # user=SXT#指定格式输出
name = 'quanxin'
#旧版本
print('{:*^20}'.format(name))
#新版本
print(f'{name:*^20}')
#数值类型的格式化输出
num = 10
print(f'{num=:.2f}') # num=10.00  :.2f代表控制输出2个小数pct = 0.834
#旧版本
print('{:.2f}%'.format(pct*100))
#新版本
print(f'{pct*100:.2f}%')

字符串新方法

方法名功能描述
str.removeprefix()如果str以它开头的话,将会返回一个修改过前缀的新字符串,否则它将返回原始字符串。
str.removesuffix()

如果str以其结尾,则返回带有修改过后缀的新字符串,否则它将返回原始字符串。

info = '泉州'
print(info.removeprefix('泉'))
print(info.removesuffix('州'))

变量类型标注

变量类型注解是用来对变量和函数的参数返回值类型做注解(暗示),帮助开发者写出更加严谨的代码,让调用方减少类型方面的错误,也可以提高代码的可读性和易用性。

但是,变量类型注解语法传入的类型表述能力有限,不能说明复杂的类型组成情况,因此引入了 typing 模块,来实现复杂的类型表达。

常用的数据类型

TypeDescription
int整型 integer
float浮点数字
bool布尔(int 的子类)
str字符 (unicode)
bytes8 位字符
object任意对象(公共基类)
List[str]字符组成的列表
Tuple[int, int]两个int对象的元组
Tuple[int, ...]任意数量的 int 对象的元组
Dict[str, int]键是 str 值是 int 的字典
Iterable[int]包含 int 的可迭代对象
Sequence[bool]布尔值序列(只读)
Mapping[str, int]从 str 键到 int 值的映射(只读)
Any具有任意类型的动态类型值
Union联合类型
Optional参数可以为空或已经声明的类型
Mapping映射,是 collections.abc.Mapping 的泛型
MutableMappingMapping 对象的子类,可变
Generator生成器类型, Generator[YieldType、SendType、ReturnType]
NoReturn函数没有返回结果
Set集合 set 的泛型, 推荐用于注解返回类型
AbstractSetcollections.abc.Set 的泛型,推荐用于注解参数
Sequencecollections.abc.Sequence 的泛型,list、tuple 等的泛化类型
TypeVar自定义兼容特定类型的变量
Generic自定义泛型类型
NewType声明一些具有特殊含义的类型
Callable可调用类型, Callable[[参数类型], 返回类型]
NoReturn没法返回值

注意:

  • mypy是Python的可选静态类型检查器。

  • 安装mypy模块

  • 使用mypy进行静态类型检查 mypy 执行python文件

基本使用

from typing import List, Set, Dict, Tuple# 对于简单的 Python 内置类型,只需使用类型的名称
x: int = 1
x: float = 1.0
x: bool = True
x: str = "test"
x: bytes = b"test"
# 对于 collections ,类型名称用大写字母表示,并且
# collections 内类型的名称在方括号中
x: List[int] = [1]
x: Set[int] = {6, 7}
# 对于映射,需要键和值的类型
x: Dict[str, float] = {'field': 2.0}
# 对于固定大小的元组,指定所有元素的类型
x: Tuple[int, str, float] = (3, "yes", 7.5)
# 对于可变大小的元组,使用一种类型和省略号
x: Tuple[int, ...] = (1, 2, 3)

简化变量类型标注

languages : list[str] = ['a','b','c']
y :dict[str,int] = {'a':1,'b':2}  
x:set[int] = {1,2,3,4}
x:tuple[str,int,int] = ('a',1,2)
#定义可变大小的可以使用省略号
x:tuple[int,...] = (1,2,3)

函数参数返回值添加类型标注

# 注释函数定义的方式
def stringify(num: int) -> str:return str(num)# 指定多个参数的方式
def plus(num1: int, num2: int) -> int:return num1 + num2# 在类型注释后为参数添加默认值
def func1(num1: int, my_float: float = 3.5) -> float:return num1 + my_float
from typing import Callabledef func1(num1:int,my_float:float=3.5) -> str:return f'返回结果{num1+my_float}'
# Callable指向可调用(函数)值的方式, lambda 可以此方法
x: Callable[[int, float], str] = func1
print(x(20,30))
from typing import Iterator
# 产生整数的生成器函数安全地返回只是一个
# 整数迭代器的函数,因此这就是我们对其进行注释的方式
def g(n: int) -> Iterator[int]:i = 0while i < n:yield ii += 1print(g(10))
for i in g(10):print(i)

混合类型检查改进

联合运算符使用“|”线来代替了就版本中Union[]方法,使得程序更加简洁。

#旧版本
from typing import Union
def oldFunc(para:Union[int,float])->Union[int,float]:return para**2
#调用
oldFunc(10)
#新版本
def newFunc(para:int|float)-> int|float:return para+10
print(newFunc(10))
print(newFunc(10.10))

类型别名更改

之前是直接通过不同类型的赋值操作来赋予类型新的名字,在新版本中通过TypeAlias来规定了类型名字的替换。这样操作的优势在于能够让程序开发人员和Python编辑器更加清楚的知道newname是一个变量名还是一个类型的别名,提升程序开发的可靠性。

#旧版本
oldname = str
def oldFunc(param:oldname) -> oldname:return param + param
oldFunc('oldFunc:QZ')
#新版本
from typing import TypeAlias
newname: TypeAlias = str
def newFunc(param:newname) -> newname:return param + param
newFunc('newFunc:QZ')

二进制表示中频率为1的数量统计

通过调用bit_count函数来统计二进制中数字“1”的个数。

# bit_count()函数
#旧版本
value = 5
print(bin(value).count("1"))
#新版本
print(value.bit_count())

字典新特性

字典的三个方法新增mapping属性

mydict = {"一":1,"二":2,"三":3}
#旧版本
print(mydict.keys(),mydict.values(),mydict.items())
#新版本
keys = mydict.keys()
values = mydict.values()
items = mydict.items()
print(keys.mapping,values.mapping,items.mapping)

在Python3.10中,针对于字典的三个方法,items,keys,和values都增加了一mapping属性,通过上诉的程序可以发现,对三个方法调用mapping属性后都会返回原字典数据。

函数zip()新增strict参数

keys = ['one','two','three','four']
values = [1,2,3,4,5]
#旧版本
print(dict(zip(keys,values)))
#新版本
print(dict(zip(keys,values,strict=True)))

对于zip函数加了strict参数,顾名思义strict参数就是要严格的通过参数长度的匹配原则,在以上代码中,keys和values列表的长度并不一致。旧版本的zip函数会根据长度最短的参数创建字典。新版本的zip函数中,当设定strict参数为True,则要求zip的输入数必须要长度一致,否则报错。

dataclass装饰器的使用 

使用类

为了支持数据修改, 默认值, 比较等功能。更加好一些的方法是:使用自定义类来实现数据类。

class Player:def __init__(self,name:str,number:int,postion:str,age:int = 18) -> None:self.name = nameself.number = numberself.postion = postionself.age = agedef __repr__(self) -> str:return f'Player: {self.name} {self.number}'def __eq__(self, __o: object) -> bool:return self.age == __o.agedef __gt__(self,__o: object) ->bool:return self.age > __o.agep1 = Player('QZ',18,'PG',26)
print(p1)

缺点

  • __init__方法中重复代码 (示例中每个属性都需要写3遍)

  • 需要自己实现__repr__方法, 和比较方法__eq____gt__

使用dataclass

dataclass 可以认为是提供了一个简写__init__方法的语法糖,类型注释是必填项 (不限制数据类型时, 添加typing.Any为类型注释), 默认值的传递方式和__init__方法的参数格式一致。

from dataclasses import dataclass
from typing import ClassVar
@dataclass
class Player:name:strnumber:intpostion:strage:intp1 = Player('QZ',18,'PG',26)
print(p1)

优点

可以使用 dataclasses 模块中的其它方法,比如:

  • 转为字典 asdict

  • 转为元组 astuple

dataclass装饰器上的参数

dataclass装饰器将根据类属性生成数据类和数据类需要的方法。

dataclasses.dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
key含义
init指定是否自动生成__init__,如果已经有定义同名方法则忽略这个值,也就是指定为True也不会自动生成
repr同init,指定是否自动生成__repr__;自动生成的打印格式为class_name(arrt1:value1, attr2:value2, ...)
eq同init,指定是否生成__eq__;自动生成的方法将按属性在类内定义时的顺序逐个比较,全部的值相同才会返回True
order自动生成__lt____le____gt____ge__,比较方式与eq相同;如果order指定为True而eq指定为False,将引发ValueError;如果已经定义同名函数,将引发TypeError
unsafehash如果是False,将根据eq和frozen参数来生成__hash__:
1. eq和frozen都为True,__hash__将会生成
2. eq为True而frozen为False,__hash__被设为None
3. eq为False,frozen为True,__hash__将使用超类(object)的同名属性(通常就是基于对象id的hash) 当设置为True时将会根据类属性自动生成__hash__,然而这是不安全的,因为这些属性是默认可变的,这会导致hash的不一致,所以除非能保证对象属性不可随意改变,否则应该谨慎地设置该参数为True
frozen设为True时对field赋值将会引发错误,对象将是不可变的,如果已经定义了__setattr____delattr__将会引发TypeError
dataclass成员变量额外设置

可以通过dataclass.filed方法设置变量的额外功能

  • defualt:设置默认值

    • 值为具体的值

  • default_factory:设置默认值

    • 值为类型名,程序会根据类型名创建一个空的对象,若使用defualt设置需要手动创建空对象

  • repr设置生成的__repr__方法中是否加入此属性,默认是True

    from dataclasses import dataclass
    @dataclass
    class Player:name:strnumber:intpostion:strage:int=field(default=19,repr=False)# 引用类型可以通过default_factory初始化参数country:str= field(default_factory=str) #  country:str= field(default='') 
    
    dataclass建立类变量

    在类中建立变量,默认是成员变量,若需要设置类变量,需要设置类型为:ClassVar

    from dataclasses import dataclass
    from typing import ClassVar
    @dataclass
    class Player:name:strnumber:intpostion:strage:intcountry:ClassVar[str]p1 = Player('QZ',18,'PG',26)
    print(p1)

    字典合并

  • 字典添加两个新的运算符:[|]和[|=]。[|]运算符用于合并字典。[|=]用于更新字典。
    dict1 = {'name':'QZ'}
    dict2 = {'type':'二线'}
    #旧版本
    dict1.update(dict2)
    print(dict1)
    #新版本
    dict3 = dict1 | dict2
    print(dict3) # {'name': 'sxt', 'type': 'IT'}#[|=]
    dict1 |= dict2 # 等价于dict1 = dict1 | dict2
    print(dict1)
    

    match语法的使用

  • match...case结构化模式匹配,可以匹配字典、类以及其他更复杂的结构。match...case的匹配模式匹配于Java或C++中的switch的使用很相似。
    # 语句结构
    '''
    match subject:case <pattern_1>:<action_1>case <pattern_2>:<action_2>case <pattern_3>:<action_3>case _:<action_wildcard>
    '''
    status = 200
    match status:case 200:print('访问成功')case 404:print('页面丢了')case _:print('不能识别')
    
    #模式匹配
    person1 = ('James',23,'male')
    person2 = ('Lili',33,'female')
    person3 = ('Mary',34,'female')
    def func(person):match person:case (name,_,'female'):print(f'{name} is woman')case (name,_,'male'):print(f'{name} is man')case (name,age,gender):print(f'{name} is {age} old')
    #调用函数
    func(person1)
    func(person2)
    func(person3)
    

    上述代码中,case函数通过匹配元组,如果元组第三个参数是“female”,匹配到第一个case。如果元组第三个参数是“male”,匹配到第二个case。如果前面两个都不匹配,则输出最后的默认结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++学生排名表(析构函数)

现在输入一批学生&#xff08;人数大于0且不超过100&#xff09;的名次和他们的姓名。要求按名次输出每个人的排名。 输入格式&#xff1a;每行为一个学生的信息&#xff0c;共两项&#xff0c;第一项为排名&#xff08;为正整数&#xff0c;且任意两名学生的排名均不同&#…

2024年武汉中级工程师评审学历、论文、业绩有什么要求?

2024年大部分地区职称申报已经开始&#xff0c;今年因为政策变动&#xff0c;基本上需要全员参加水平能力测试&#xff0c;水测通过之后安排评审&#xff0c;那么对于中级职称评审有什么要求呢&#xff1f;我们一起跟甘建二看看。 一、2024年武汉中级工程师职称评审学历要求&am…

Web前端—属性描述符

属性描述符 假设有一个对象obj var obj {a:1 }观察这个对象&#xff0c;我们如何来描述属性a&#xff1a; 值为1可以重写可以遍历 我们可以通过Object.getOwnPropertyDescriptor得到它的属性描述符 var desc Object.getOwnPropertyDescriptor(obj, a); console.log(desc);我…

安卓逆向 | 某X游戏垂类Web nonce

*本案例仅做分析参考,如有侵权请联系删除 1.逻辑分析 通过XHR断点,然后逐步往上调发现nonce生出处。 在console执行下函数 其中 i,是当前日期和时间的秒级时间戳,并将其向下取整到最接近的整数。 i = ~~(+_.w() / 1e3)w</

设计模式之迭代器模式(上)

迭代器模式 1&#xff09;概述 1.概念 存储多个成员对象&#xff08;元素&#xff09;的类叫聚合类(Aggregate Classes)&#xff0c;对应的对象称为聚合对象。 聚合对象有两个职责&#xff0c;一是存储数据&#xff0c;二是遍历数据。 2.概述 迭代器模式(Iterator Patter…

Go语言不能常量取址!?

题如下图 在软件开发中&#xff0c;常量是一种重要的编程元素&#xff0c;它们在程序中起到固定值的作用被大量使用 Go语言中的常量取址 在 Go 语言中&#xff0c;常量是无法被取址的。这意味着我们不能使用取址操作符 & 来获取常量的地址。例如&#xff1a; const a …

【Java EE】关于Spring MVC 响应

文章目录 &#x1f38d;返回静态页面&#x1f332;RestController 与 Controller 的关联和区别&#x1f334;返回数据 ResponseBody&#x1f38b;返回HTML代码片段&#x1f343;返回JSON&#x1f340;设置状态码&#x1f384;设置Header&#x1f338;设置Content-Type&#x1f…

MySQL高级(索引分类-聚集索引-二级索引)

目录 1、主键索引、唯一索引、常规索引、全文索引 2、 聚集索引、二级索引 3、回表查询 4、通过id查询和通过name查询那个执行效率高&#xff1f; 5、 InnoDB主键索引的 B tree 高度为多高呢&#xff1f; 1、主键索引、唯一索引、常规索引、全文索引 在MySQL数据库&#xff0c…

[【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

微信小程序picker设置了系统年度,打开选择年份从1年开始显示

背景&#xff1a;开发微信小程序时&#xff0c;使用了picker组件&#xff0c;设置值为当前系统时间年份&#xff0c;可以正常回显年份。但是打开面板选择年份的时候&#xff0c;默认从一年开始显示的。如下图所示。 原因&#xff1a;因为绑定的年份字段为Number类型。 解决方案…

文心一言 vs. GPT-4: 全面比较

1. 训练数据和预训练 文心一言 训练数据&#xff1a;文心一言是由中国研究人员开发的中文语言模型。它主要在大量古典中文文学作品上进行训练&#xff0c;包括诗歌、散文和历史文本。这些文学作品涵盖了丰富的中文语言和文化&#xff0c;使得文心一言在传统文化方面具有独特优…

React中State管理的4 个关键解决方案

在 React 应用开发中,状态(state)管理是非常重要的一部分。合理地管理状态可以确保组件的行为正确,提高应用的可维护性和性能。然而,在实际使用 React 的 state 时,开发者常常会遇到一些常见的问题和陷阱。 本文将从解决问题的角度,总结 React 中 state 管理的4个关键技巧: 使…

面向对象知识汇总(5)

目录 Day 5问题二十二&#xff1a;抽象类1. 抽象类概念2. 抽象类语法3. 抽象类特性4. 抽象类和普通类的区别 问题二十三&#xff1a;接口1. 接口的概念2. 接口的语法规则3. 接口的使用4. 接口的特性5. 实现多个接口6. 接口间的继承 Day 5 问题二十二&#xff1a;抽象类 1. 抽…

考研总计划篇

政治 九月份开始听徐涛老师的课&#xff0c;只需要听哲学&#xff0c;政治&#xff0c;经济学即可&#xff0c;然后用仓盾小程序刷题&#xff0c;刷题就吃饭的时候刷就是了。 工具书—苏一的提分手册&#xff0c;每天抽一个小时刷刷上面的知识点。 英语&#xff08;现在到九…

12(13)(14)-2(1)-CSS 字体图标+实战:商城首页

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 CSS 字体图标1 字体图标的产生2 字体图标的优点3 字体图标的下载4 字体图标的…

WordPress LayerSlider插件SQL注入漏洞复现(CVE-2024-2879)

0x01 产品简介 WordPress插件LayerSlider是一款可视化网页内容编辑器、图形设计软件和数字视觉效果应用程序,全球活跃安装量超过 1,000,000 次。 0x02 漏洞概述 WordPress LayerSlider插件版本7.9.11 – 7.10.0中,由于对用户提供的参数转义不充分以及缺少wpdb::prepare(),…

【第二十三篇】Burpsuite+SQL注入实现登录绕过等(靶场实战案例)

目录 Where+SQL注入获取隐藏数据SQL注入实现登录绕过Union+SQL注入获取数据库类型和版本Where+SQL注入获取隐藏数据 存在一个业务场景如下 筛选商品时,后端查询语句如下: SELECT * FROM products WHERE category = Gifts AND released = 1只有商品名匹配且该商品已发布(r…

ubuntu系统开机无限循环输入密码后黑屏【以及问题2:ls后桌面有文件但是桌面看不到】的解决方法

问题1&#xff1a;刚进来黑屏&#xff0c;无限循环输入密码后黑屏亮屏&#xff0c;然后又输入密码黑屏亮屏…… 解决方法&#xff1a;卸载重装桌面系统ubuntu-desktop那个。然后用的是在命令行startx可以进入一个新的与图形化界面&#xff0c; 然后进来界面后&#xff0c; 又遇…

使用vue3搭建一个CRM(客户关系管理)系统

目录 1. 需求分析 2. 设计 3. 技术选型 4. 开发环境搭建 5. 前端开发 6. 后端开发 7. 数据库搭建 8. 测试 9. 部署 10. 维护和迭代 总结 搭建一个CRM&#xff08;客户关系管理&#xff09;系统是一个复杂的项目&#xff0c;涉及到需求分析、设计、开发、测试和部署等…