Python的语法糖及其进化,带范例

news2024/12/27 12:14:57

话说python也算是多年媳妇熬成婆的典范了。

1)3.6以后引入的f-格式化字符串,现在写代码更像写小作文了,而且折行顺眼多了。

print(f"""Hello,
{"World".upper()}""")

2)3.5以后引入的:和->类型注解,并且配套mypy 静态检查工具,可以减少很多莫名其妙的报错。

3)列表推导式(List Comprehensions):

# 创建一个包含0到9的平方的列表
squares = [x**2 for x in range(10)]
print(squares)

# 与以下写法等同 - 
# squares = []
# for x in range(10):
#     squares.append(x**2)
# print(squares

# 创建一个包含偶数的列表
evens = [x for x in range(10) if x % 2 == 0]
print(evens)

# 与以下写法等同 - 
# evens = []
# for x in range(10):
#     if x % 2 == 0:
#         evens.append(x)
# print(evens)

# 创建一个包含字符串长度的列表
str_lengths = [len(s) for s in ['apple', 'banana', 'cherry']]
print(str_lengths)

# 与以下写法等同 - 
# str_lengths = []
# for s in ['apple', 'banana', 'cherry']:
#     str_lengths.append(len(s))
# print(str_lengths)

4)字典推导式(Dictionary Comprehensions):

squares_dict = {x: x**2 for x in range(10)}
print(squares_dict)

# 与以下写法等同 - 
# squares_dict = {}
# for x in range(10):
#     squares_dict[x] = x**2
# print(squares_dict)

5)生成器表达式(Generator Expressions):

squares_gen = (x**2 for x in range(10))  # 使用圆括号
# 生成器表达式是一个迭代器对象,而不是一个列表或者元组,所以直接打印squares_gen只会显示生成器对象的内存地址,而不是它生成的值。
print(squares_gen)

for x in squares_gen:
    print(x)

6)多重赋值(Multiple Assignments) or 解包赋值(Unpacking Assignment):

# 交换变量a和b的值
a, b = 1, 2
print(a,"\n",b)
a, b = b, a
print(a,"\n",b)

# 从元组中解包元素
tup = (3, 4, 5)
x, y, z = tup
print(x,"\n",y,"\n",z)

# 从列表中解包元素
lst = [6, 7, 8]
j, k, l = lst
print(j,"\n",k,"\n",l)

7)with语句(Context Managers):

with open('example.txt', 'w') as file:
    file.write('Hello, world!')
# 文件在这里已经自动关闭了

import sqlite3
with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    cursor.execute('CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, value TEXT)')
    cursor.execute('INSERT INTO test (value) VALUES (?)', ('Hello, world!',))
    conn.commit()
# 数据库连接在这里已经自动关闭了

from threading import Lock

lock = Lock()

with lock:
    # 临界区代码,这里可以安全地执行需要同步的操作
    print('Lock is acquired, performing critical section operations.')
# 锁在这里已经自动释放了

8)*args和**kwargs:

# 定义一个示例函数,它接受任意数量的位置参数和关键字参数
def outer_func(*args, **kwargs):
    print("Outer function received:")
    # 使用 print_args 函数打印所有位置参数
    print("Positional arguments:", args)
    # 使用 print_kwargs 函数打印所有关键字参数
    print("Keyword arguments:", kwargs)

# 使用位置参数调用函数
outer_func(1, 2, 3)

# 使用关键字参数调用函数
outer_func(name='Alice', age=25)

# 调用 outer_func 函数,传入任意数量的位置参数和关键字参数
outer_func(1, 2, 3, name='Alice', job='Engineer')

# 这里使用 * 来解包一个元组作为位置参数,使用 ** 来解包一个字典作为关键字参数
args_tuple = (4, 5, 6)
kwargs_dict = {'city': 'New York', 'country': 'USA'}
outer_func(*args_tuple, **kwargs_dict)

9)属性装饰器(Property Decorators):

class MyClass:
    def __init__(self, value=0):
        self._value = value  # 使用一个私有变量来存储值

    @property
    def value(self):
        """getter:返回属性值"""
        print("Getting value")
        return self._value

    @value.setter
    def value(self, new_value):
        """setter:设置属性值前可以添加一些逻辑,比如类型检查或值的校验"""
        if not isinstance(new_value, (int, float)):
            raise ValueError("Value must be an int or float")
        print("Setting value to:", new_value)
        self._value = new_value

    @value.deleter
    def value(self):
        """deleter:删除属性时可以执行一些清理操作"""
        print("Deleting value")
        del self._value

# 使用示例
my_instance = MyClass()

# 访问属性,将调用 getter 方法
print(my_instance.value)  # 输出: Getting value 和 value

# 设置属性,将调用 setter 方法
my_instance.value = 10  # 输出: Setting value to: 10

# 再次访问属性,验证值是否设置成功
print(my_instance.value)  # 输出: value

# 删除属性,将调用 deleter 方法
del my_instance.value  # 输出: Deleting value

# 尝试再次访问属性,将抛出 AttributeError,因为属性已被删除
print(my_instance.value)  # 这将抛出错误

10)双下划线方法/魔术方法/特殊方法:

class MyDict:
    def __init__(self):
        self.data = {}  # 初始化一个空字典来存储数据

    def __getitem__(self, key):
        # 尝试返回字典中与键关联的值
        # 如果键不存在,将抛出 KeyError
        return self.data[key]

    def __setitem__(self, key, value):
        # 设置字典中键的值
        self.data[key] = value

    def __delitem__(self, key):
        # 删除字典中与键关联的项
        # 如果键不存在,将抛出 KeyError
        del self.data[key]

    def __iter__(self):
        # 返回字典键的迭代器
        return iter(self.data)

    def __len__(self):
        # 返回字典中项的数量
        return len(self.data)

    def __str__(self):
        # 返回字典的字符串表示,方便打印
        return str(self.data)

    def __repr__(self):
        # 返回字典的官方字符串表示,用于调试
        return f"MyDict({self.data!r})"

# 使用示例
my_dict = MyDict()
my_dict['apple'] = 1
my_dict['banana'] = 2

print(my_dict['apple'])  # 输出: 1
print(my_dict)            # 输出: {'apple': 1, 'banana': 2}
print(len(my_dict))      # 输出: 2

del my_dict['banana']
print(my_dict)            # 输出: {'apple': 1}

for key in my_dict:
    print(key)            # 依次输出: apple

print(repr(my_dict))      # 输出: MyDict({'apple': 1})

11)lambda函数:

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出: [2, 4, 6]

pairs = [(1, 'one'), (2, 'two'), (3, 'three')]
sorted_pairs = sorted(pairs, key=lambda pair: pair[1])
print(sorted_pairs)  # 输出: [(3, 'three'), (1, 'one'), (2, 'two')]

from functools import reduce

numbers = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x * y, numbers)
print(result)  # 输出: 120

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

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

相关文章

普通人如何抓住AI浪潮的入局之路?

前言 随着生成式AI的迅速普及,不仅科技巨头们纷纷投入重金布局,招聘市场也随之发生了显著变化。对于程序员而言,掌握AI技术已成为提升个人竞争力的关键。然而,面对复杂的理论和技术栈,很多人仍然感到迷茫,…

Windows11安装MySQL8.4.2版本详细过程记录

下载 地址:https://dev.mysql.com/downloads/mysql/8.0.html 我选择下载zip版本: 点击下载需要登录: 于是我登录: 接着点下载: 被迅雷拦截了,直接使用迅雷下载: 下载好了&#xff1…

用Python来DIY一个AI面部情绪识别API的简单方案

基于人工智能的面部情绪识别API在很多场景都得到了应用,在人们情绪化消费、兴趣化消费的当下,如何察言观色,洞察用户真实的心理活动非常必要,对于大多数的人来说,这事非常有挑战,好在以ChatGPT为代表的大语…

如何实现ECharts图表根据屏幕大小自适应?

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-ECharts自适应 目录 前言 1920*1080分辨率示图 8184*2432分辨率示图 以vue3ts开发为例 (…

CSS 如何实现彩色渐变效果的文字

效果图如下&#xff1a;实现文字的字体颜色由 #ad4bd7 向 #6351fe 的颜色渐变效果。 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widt…

python 直接引用、浅拷贝、深拷贝的区别

1. 简述 简单来讲&#xff0c;直接引用所指向的地址是原对象的地址&#xff0c;深拷贝所指向的是新对象的地址&#xff0c;浅拷贝介于二者之间&#xff0c;原对象的直接子对象为新&#xff0c;子孙对象为原子孙对象。 下面用两个变量 a、b&#xff0c;一个字典对象 {‘aaa’:…

数学建模--拟合算法

目录 拟合与插值的区别 常用的拟合算法 应用实例 总结 最小二乘法在不同数据分布下的性能表现如何&#xff1f; 傅里叶级数拟合在图像处理中的应用案例有哪些&#xff1f; 贝叶斯估计法与最大似然估计法在参数估计中的优缺点分别是什么&#xff1f; 最大似然估计法&…

QT QTableView使用自定义数据模型

创建一个Qt工程-QMainWindow 添加控件 给按钮加上点击事件 创建数据结构 4.1 使用结构体或类定义自己的数据结构 4.2 声明数据结构体 #pragma once #ifndef MYDATA_H #define MYDATA_H #include<QString> struct Data {int index;QString name;QString sex; }; #endif …

auto和范围for

auto auto&#xff1a;自动推导类型功能 1.在早期 C/C 中 auto 的含义是&#xff1a;使用 auto 修饰的变量&#xff0c;是具有自动存储器的局部变量&#xff0c;后来这个 不重要了。 C11 中&#xff0c;标准委员会变废为宝赋予了 auto 全新的含义即&#xff1a; auto 不再是一…

MATLAB画散点密度图(附代码和测试数据的压缩包)

1. 有关 Matlab 获取代码关注WZZHHH回复关键词&#xff0c;或者咸鱼关注&#xff1a;WZZHHH123 怀俄明探空站数据解算PWV和Tm&#xff1a;怀俄明探空站数据解算PWV和Tm 怀俄明多线程下载探空站数据&#xff08;包括检查和下载遗漏数据的代码&#xff09;&#xff1a;怀俄明多线…

UE5 Niagara 粒子缩放—跟随物体缩放

使用Niagara粒子时&#xff0c;默认情况下&#xff0c;在世界大纲中的粒子不会随着actor的Scale缩放而改变 方法一&#xff1a;添加Scale Sprite Size 节点 方法二&#xff1a;使用 Apply Owner Scale to Attributes 节点 根据需要缩放的变量进行设置。 方法三&#xff1a;使用…

《Redis设计与实现》读书笔记-客户端

目录 1.Client简介 2.客户端属性 1&#xff09;&#xff08;本文重点&#xff09;比较通用的属性 2&#xff09;&#xff08;后续分享&#xff09;另外一类是和特定功能相关的属性 2.1套接字文件描述符 2.2名字 2.3标志&#xff08;flag&#xff09; 2.4输入缓冲区 2.…

esp-idf-v5.1.1所有官方例程讲解(esp32、esp32-C2、esp32-S3)之 a2dp_sink 详解

目录 1. 获取ESP-IDF和示例代码 2. 导航到示例代码 3. 示例代码结构 4. 关键文件解析 main.c 初始化和配置: bt_app_core.c 和 bt_app_core.h bt_app_av.c 和 bt_app_av.h A2DP事件处理: AVRCP事件处理: bt_app_sink.c 和 bt_app_sink.h 5. 编译和烧录 6. 测试…

【Linux】全志Tina etc目录下关键文件内容修改

一、文件位置 V:\f1c100s\Evenurs\f1c100s\tina\target\allwinner\c200s-F1C200s\busybox-init-base-files\etc\ssv6x5x-wifi.cfg 二、文件内容 三、介绍 在此目录下&#xff0c;可以修改在etc目录下的文件内容&#xff0c;此处举例修改一个wifi模块的配置文件数据。

探索Python的`retries`库:让代码更健壮的利器

探索Python的retries库&#xff1a;让代码更健壮的利器 背景&#xff1a;为何选择retries库&#xff1f; 在软件开发过程中&#xff0c;我们经常会遇到需要重复尝试执行某些操作的情况&#xff0c;比如网络请求、文件读写等。这些操作可能会因为各种原因暂时失败&#xff0c;但…

计算机专业,如何在大一领先其他人?关键是打破信息差!

高考录取陆续结束&#xff0c;不少同学报考计算机专业&#xff0c;然而&#xff0c;大部分人面对即将开启的计算机本科课程还是一无所知。 计算机的大学四年&#xff0c;都学些什么&#xff1f;要一直跟字符打交道吗&#xff1f;其实不然&#xff0c;编程的世界远比我们想象的…

[BJDCTF2020]EasySearch (SSI注入漏洞)

这题ctrlU发现往index.php提交数据&#xff0c;但是我目录&#xff0c;git泄露&#xff0c;sqlmap&#xff0c;爆破admin密码都没有作用&#xff0c;数据包页面也没有什么重置密码注册的功能 这种三无题多半是要拿源码做的&#xff0c;我又拿我备份文件字典扫了一下结果发现ind…

开发无人带货直播插件

在当今快速发展的电商行业中&#xff0c;直播带货已成为推动销售增长的重要力量&#xff0c;然而&#xff0c;随着直播市场的日益饱和和消费者需求的不断变化&#xff0c;如何在保持直播互动性的同时&#xff0c;实现高效、低成本的运营成为许多商家关注的焦点。 无人带货直播…

Python | Leetcode Python题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; class Solution:def lengthOfLIS(self, nums: List[int]) -> int:d []for n in nums:if not d or n > d[-1]:d.append(n)else:l, r 0, len(d) - 1loc rwhile l < r:mid (l r) // 2if d[mid] > n:loc midr mid - 1else:l…