当前位置: 首页 > news >正文

Python 中被忽视的核心功能

这篇文章主要介绍了一些在 Python 编程中可能被忽视的核心功能,包括默认参数、海象运算符、*args 和 **kwargs 的使用、变量交换、str 与 repr 的区别、可迭代对象的扩展解包、多个上下文管理器的使用、Python 调试器、collections.Counter 的使用、itertools 的使用以及下划线的两种用法等。

因为这门语言非常容易学,许多实践者只是了解了它的基础知识,而忽略了深入探讨这门语言更高级和强大的方面,这也是它真正独特和强大的地方。

所以,让我们简要讨论一下所有你可能还没有听说过的功能,但如果你想成为一名真正经验丰富的 Pythonista,你肯定想了解。

参数默认值

需要重点注意的是,Python 的参数在遇到函数定义时就进行评估。这意味着每次调用 fib_memo 函数(下文会提到)而没有明确提供 memo 参数的值时,它将使用函数定义时创建的相同字典对象。

def fib_memo(n, memo={0:0, 1:1}):  """   n 是你想要返回的序列中的第 n 个数字   """  if not n in memo:    memo[n] = fib_memo(n-1) + fib_memo(n-2)  return memo[n]# 返回一个介于0和100之间(包括0和100)的数字。 
fib_memo(6)  # 应该返回8

这段代码在 Python 中可以正常运行。这也意味着你可以在一个脚本中多次执行 fib_memo 函数,比如在一个 for 循环中,每次执行都会增加要计算的 fibonacci 数字,而不会达到“超过最大递归深度”的限制,因为 memo 会不断扩展。关于这方面的更多信息可以在我的另一篇文章中找到。

海象操作符

海象操作符 (:= ) 是在 Python 3.8 中引入的,它允许你在表达式中为变量赋值。这样,你可以在一个表达式中为变量赋值并检查其值:

import random
some_value = random.randint(0,100)  # 返回一个介于0和100之间(包括0和100)的数字。
if((below_ten := some_value) < 10):    print(f"{below_ten} 小于 10")

显然,它也可以方便地赋值并检查返回的值是否包含真值:

if(result := some_method()):   # 如果结果不为假值(Falsy)  print(result)

*args 和 **kwargs

通过星号 (* ),你可以在传递给函数之前解包参数或关键字参数(使用 ** )。

例如,考虑以下代码:

my_numbers = [1,2]
def sum_numbers(first_number, second_number):    return first_number + second_number# 这将返回一个类型错误。
# 类型错误:sum() 缺少 1 个必需的位置参数:“second_number” sum_numbers(my_numbers)#这将返回预期的结果,3。
sum_numbers(*my_numbers)

当我们调用 sum_numbers 函数时,如果不解包 my_numbers,它会引发一个 TypeError ,因为函数期望两个独立的参数。然而,通过使用星号 (*),我们可以从 my_numbers 中解包值并将它们作为独立的参数传递,从而得到正确的输出。

这种解包技术不仅适用于元组和列表,还适用于字典(尽管它会将键作为参数传递)。那么关键字参数呢?对此,我们可以利用双星号 (**)。以下代码作为例子:

def greet_person(last_name, first_name):  print(f"Hello {first_name} {last_name}")data = {"first_name": "John", "last_name": "Doe"}
greet_person(**data)

除了解包一个序列来将它们作为函数的参数,你也可以用它来创建一个新的序列,例如:

numbers = [1, 2, 3, 4, 5]
new_list_numbers = [*numbers]

原始的 numbers 列表保持不变,而你有一个 new_list_numbers 变量,它包含了相同列表的副本。然而,对于包含对象的链接要小心:

numbers = [[1, 2], [3, 4], [5, 6]]
packed_numbers = [*numbers]numbers[0].append(10)   # 修改原始列表中的嵌套列表print(numbers)      # 输出: [[1, 2, 10], [3, 4], [5, 6]]    
print(packed_numbers)   # 输出: [[1, 2, 10], [3, 4], [5, 6]]

any 和 all

any 和 all 是两个内建函数,它们对可迭代对象(如列表、元组或集合)进行操作,并基于可迭代对象中的元素返回一个布尔值。

例如:

some_booleans = [True, False, False, False]any(some_booleans) # 返回 True
all(some_booleans) # 返回 False

你可以将 all 和 any 函数与列表推导式结合使用,它返回一个可迭代的结果并将其作为参数传递给 all 函数:

numbers = [5, 10, 3, 8, -2]
all_positive = all(num > 0 for num in numbers)

… 或 any 函数:

fruits = ['apple', 'banana', 'cherry', 'durian']# 检查是否所有水果都以“a”开头
result = all(fruit.startswith('a') for fruit in fruits)
print(result)

下面的表格显示了根据可迭代对象中的值返回的输出的不同。

图片

变量交换

你可以组合元组打包(在等号 (=) 右边发生)和解包(在等号 (=) 左边发生),并利用这个功能进行变量交换:

a = 10
b = 5# 通过打包和解包交换 b 和 a 的值
a, b = b, aprint(a)  #5
print(b)  #10

str vs repr

我们习惯于使用 str(some_value) 将某个变量或值转换为字符串,以便于进行调试打印。我想让你了解 repr(some_value)。主要的区别是 repr 尝试返回对象的可打印表示,而 str 只尝试返回一个字符串表示。

下面是一个更好的例子:

import datetimetoday = datetime.datetime.now()print(str(today))print(str(today))   # 输出: 2023-07-20 15:30:00.123456
print(repr(today))  # 输出:datetime.datetime(2023, 7, 20, 15, 30, 0, 123456)

如你所见,str() 简单地将 datetime 作为一个字符串表示返回。如果你想确定变量 today 是否包含一个字符串还是一个 datetime 对象,你无法单独从这个信息中得到答案。另一方面,repr() 提供了有关变量所持有的实际对象的信息。在调试过程中,这个信息会更有价值。

扩展的可迭代对象解包

这个可以简单理解:如果你想通过一个命令获取序列的第一个和最后一个值:

first, *middle, last = [1, 2, 3, 4, 5]print(first)  # 1
print(middle) # [2, 3, 4]
print(last)   # 5

但这也是可行的

*the_first_three, second_last, last = [1, 2, 3, 4, 5]print(the_first_three) # [1, 2, 3]
print(second_last)     # 4
print(last)            # 5

或者其他组合。

多个上下文管理器

我们习惯于一次使用一个上下文管理器,比如打开一个文件:

with open('file.txt', 'r') as file:# 使用该文件的代码# 该文件将在块结束时自动关闭# 即使发生异常# 示例:从文件中读取行for line in file:print(line.strip())with open('file_2.txt', 'r') as other_file:# 第二个上下文管理器for line in other_file:print(line.strip())

但我们可以轻易地在一个语句中打开多个文件。如果你想将一行写入另一个文件,这非常简便:

with open('file1.txt') as file1, open('file2.txt') as file2:# 同时使用 file1 和 file2 的代码# 文件将在块结束时自动关闭# 即使发生异常# 示例:从文件 1 读取行并将其写入文件 2for line in file1:file2.write(line)

Python 调试器

我们可以在我们的文件中打印大量的变量进行调试,或者我们可以简单地使用 Python 调试器 (pdb),它帮助我们设置断点,使得操作更加简单:

import pdb# 在你的代码中设置这个断点
pdb.set_trace()

使这个功能更有价值的是,程序会在你设置的断点处停止,你可以打印任何变量来检查其在特定断点处的值或存在情况。试试看!当程序触发一个断点时,你可以使用以下几个命令:

  • n 或 next:执行下一行。

  • s 或 step:步入函数调用。

  • c 或 continue:继续执行直到下一个断点。

  • l 或 list:显示当前的代码上下文。

  • p 或 pp :打印表达式的值。

  • b 或 break :在指定的行设置一个新的断点。

  • h 或 help:获取关于 pdb 的使用帮助。

  • q 或 quit:退出调试器并终止程序。

collections.Counter

collections 模块中的 Counter 类提供了一种便捷的方式来计算可迭代对象中的元素个数:

Counter``collections
from collections import Countermy_list = [1, 2, 3, 1, 2, 1, 3, 4, 5]
counts = Counter(my_list)
print(counts)  # 输出: 计数器({1: 3, 2: 2, 3: 2, 4: 1, 5: 1})

使用 Itertools 实现组合

我们可以组合不同的 for 循环来创建排列、组合或笛卡尔积,或者我们可以简单地使用内建的 itertools。

Permutations(排列)

import itertools# 生成排列
perms = itertools.permutations([1, 2, 3], 2)
print(list(perms))  # 输出: [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

Combinations(组合)

import itertools# 生成组合
combs = itertools.combinations('ABC', 2)
print(list(combs))  # 输出: [('A', 'B'), ('A', 'C'), ('B', 'C')]

Cartesian product(笛卡尔积)

import itertools# 生成笛卡尔积
cartesian = itertools.product('AB', [1, 2])
print(list(cartesian))  # 输出: [('A', 1), ('A', 2), ('B', 1), ('B', 2)]

下划线的两种用法

下面是在 Python 中使用下划线的两种方式:作为大数字的分隔符或作为丢弃变量。

丢弃变量

下划线 _ 可以用作丢弃变量,用来丢弃不想要的值:

# 忽略函数的第一个返回值
_, result = some_function()# 不使用循环变量进行循环
for _ in range(5):do_something()# 你只需要第一个和最后一个
first, *_, last = [1, 2, 3, 4, 5]

大数字的分隔符

在处理大数字值时,你可以使用下划线 (_) 作为视觉分隔符以提高可读性。这个特性在 Python 3.6 中被引入,被称为 “下划线字面量”。

population = 7_900_000_000
revenue = 3_249_576_382.50print(population)  # 输出: 7900000000
print(revenue)  # 输出: 3249576382.5

你知道 Python 中还有哪些容易被忽略的好用功能或技巧?欢迎在评论区留言分享。

相关文章:

Python 中被忽视的核心功能

这篇文章主要介绍了一些在 Python 编程中可能被忽视的核心功能&#xff0c;包括默认参数、海象运算符、*args 和 **kwargs 的使用、变量交换、str 与 repr 的区别、可迭代对象的扩展解包、多个上下文管理器的使用、Python 调试器、collections.Counter 的使用、itertools 的使用…...

Java+Excel+POI+testNG基于数据驱动做一个简单的接口测试【杭州多测师_王sir】

一、创建一个apicases.xlsx放入到eclipse的resource里面&#xff0c;然后refresh刷新一下 二、在pom.xml文件中加入poi和testng的mvn repository、然后在eclipse的对应目录下放入features和plugins&#xff0c;重启eclipse就可以看到testNG了 <!--poi excel解析 --><d…...

2023.8.12号论文阅读

文章目录 TriFormer: A Multi-modal Transformer Framework For Mild Cognitive Impairment Conversion Prediction摘要本文方法实验结果 SwIPE: Efficient and Robust Medical Image Segmentation with Implicit Patch Embeddings摘要本文方法实验结果 TriFormer: A Multi-mod…...

R语言中的函数24:Combinat:combn(), permn()

介绍 combinat中的combn()和permn()函数可以得到所有的排列组合的情况 combn()函数 combn(x, m, funNULL, simplifyTRUE, …)x – 组合的向量源m – 要取的元素的数量fun – 应用于每个组合的函数(可能为空)simplify – 逻辑的&#xff0c;如果是FALSE&#xff0c;返回一个列…...

C++隐式调用和explicit关键字

隐式类型转换 #include <iostream> using namespace std;class Point { public:int x, y;Point(int x 0, int y 0): x(x), y(y) {} };void displayPoint(const Point& p) {cout << "(" << p.x << "," << p.y <&l…...

Git 清除所有本地修改

Git 清除所有本地修改 1. 上才艺 1. 上才艺 git reset --hard && git clean -dfreset 返回到某个节点&#xff0c;不保留修改&#xff08;删除的是已跟踪的文件&#xff09;clean 删除的是未跟踪的文件 谢谢...

快速获得图像中像素值的小工具

之前项目中为了做lka中获得rgb图像信息&#xff0c;网上大多方案是确定相关的区域然后输出像素值&#xff0c;这个方法太麻烦&#xff0c;做了一个简单的使用鼠标点击图片某区域&#xff0c;然后直接在终端输出该区域的像素值。下面是源码&#xff1a; import cv2 import matp…...

yolo数据增强

yolo数据增强 🔥 数据集说明 😂一. labelimg 😅1. labelimg数据增强2. labelimg转换为yolo数据集二. labelme 😆1. labelme 分割数据增强2. labelme分割数据集转换yolo分割数据集三. coco 数据集格式1. coco 数据集格式数据增强 并转换至labelme 格式2. coco 数据集格式…...

环保行业如何开发废品回收微信小程序

废品回收是近年来受到越来越多人关注的环保行动。为了推动废品回收的普及和方便&#xff0c;我们可以利用微信小程序进行制作&#xff0c;方便人们随时随地参与废品回收。 首先&#xff0c;我们需要注册并登录乔拓云账号&#xff0c;并进入后台。乔拓云是一个提供微信小程序制作…...

个人对哈希数据结构学习总结 -- 理论篇

个人对哈希数据结构学习总结 -- 理论篇 引言哈希表设计思考哈希冲突Hash Functions冲突解决开放地址法(Open Addressing)分离链表法(Separate Chaining)Two-way Chaining Dynamic Hash Tableschained Hashingextendible hashinglinear hashing说明 spiral storage 使用场景小结…...

在CMamke生成的VS项目中插入程序

在主文件夹的CMakeLists.tex中加入SET(COMPILE_WITH_LSVM OFF CACHE BOOL "Compile with LSVM") 再添加IF(COMPILE_WITH_LSVM) MESSAGE("Compiling with: LSVM") ADD_DEFINITIONS(-DCOMPILE_WITH_LSVM) ADD_SUBDIRECTORY(LSVM) LIST(APPEND SRC LSVM_wrap…...

198、仿真-基于51单片机函数波形发生器调幅度频率波形Proteus仿真(程序+Proteus仿真+原理图+流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…...

Django 初级指南:创建你的第一个 Django 项目

Django 是一个强大的 Python Web 框架&#xff0c;它采用了“模型-视图-控制器”&#xff08;MVC&#xff09;的设计模式&#xff0c;能够帮助开发者快速、简洁地创建高质量的 Web 应用。这篇文章将引导你创建你的第一个 Django 项目。 一、安装 Django 首先&#xff0c;你需…...

【MySQL】使用C++连接数据库

目录 前置工作代码常用函数接口整体示例&#xff1a; 前置工作 创建数据库并选中 mysql> create database conn; Query OK, 1 row affected (0.01 sec)mysql> show databases; -------------------- | Database | -------------------- | information_schema…...

php代码审计,php漏洞详解

文章目录 1、输入验证和输出显示2、命令注入(Command Injection)3、eval 注入(Eval Injection)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL 注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)7、Session 会话劫持(Session Hijacking…...

uniapp 将标题背景更换背景图片 完美解决(附加源码+实现效果图)

问题描述 今天拿到小程序的设计效果图后&#xff0c;标题部分背景需要加背景图片&#xff0c;以往我做的都是标题背景更换颜色等&#xff0c;加背景图片还是第一次遇到&#xff0c;大家可以先看下我的效果图是否与你遇到的问题一致&#xff01; 首页标题的背景是个背景图片。 …...

必备工具:Postman Newman 详解

目录 Postman Newman 是什么&#xff1f; Postman Newman 的作用 如何使用 Postman Newman&#xff1f; 第一步&#xff1a;安装 Node.js 第二步&#xff1a;全局安装 Newman 第三步&#xff1a;导出集合或环境变量为 JSON 格式 第四步&#xff1a;使用 Newman 运行测试…...

OpenCV基本操作——算数操作

目录 图像的加法图像的混合 图像的加法 两个图像应该具有相同的大小和类型&#xff0c;或者第二个图像可以是标量值 注意&#xff1a;OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作&#xff0c;而Numpy添加的是模运算 import numpy as np import cv2 as cv imp…...

css实现文字首行缩进的效果

<div class"content"><p>站在徐汇滨江西岸智塔45楼&#xff0c;波光粼粼的黄浦江一览无余。近处&#xff0c;是由龙华机场储油罐改造而来的油罐艺术中心和阿里巴巴上海总部办公处。远处&#xff0c;历史悠久的龙华塔挺拔秀丽&#xff0c;总投资逾600亿元…...

Eclipse-配置彩色输出打印

文章目录 前言配置下载查看是否安装 前言 这是一篇古老的文章&#xff0c;那个时候还在用Eclipse &#xff0c;现在已经换 IDEA 了… 这是一篇 2018 年的文章&#xff0c;我只是将文章从个人比较挪到了CSDN 中 配置 配置完然后下载下面插件即可生成彩色代码。 下载 ANSI …...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...