10个让你的 Python 代码更具 pythonic 风格的示例

2023-05-16

10个让你的 Python 代码更具 pythonic 风格的示例

    • #1 变量交换
    • #2 函数返回元组(自动打包/解包)
    • #3 多重比较
    • #4 多重比较
    • #5 列表推导式
    • #6 将 Python 字典当做缓存
    • #7 关键字参数
    • #8 读取文件
    • #9 适用 HTTP
    • #10 装饰器

在这里插入图片描述

术语 “Pythonic”, 不仅仅意味着使用一些独特的 Python 语法,更重要的是代码的整洁、适用且极具表现力。

下面我收集了 10 个代码片段,通过示例演示一些 “Pythonic” 风格。

#1 变量交换

// C-like code  
int temp = a;  
a = b;  
b = temp;

# Python code  
a, b = b, a

在 Python 中,这实际上是通过元组的自动打包/解包将一个元组 (b, a) 分配给另一个 (a, b)。

#2 函数返回元组(自动打包/解包)

// C-like code  
struct UserInfo {  
    char* name,  
    int age,  
    char* email  
};  
UserInfo* get_user_info(uint64_t id) {  
    // ...  
    return userInfo;  
}

UserInfo* userInfo = get_user_info(id);  
// using userInfo->name, userInfo->age, userInfo->email  

# Python code  
def get_user_info(id):  
    # ...  
    return name, age, email

name, age, email = get_user_info(id) 
# using name, age, email

#3 多重比较

// C-like code  
if (0 <= x && x < y && y <= 100) {  
    // do something  
}

# Python code  
if 0 <= x < y <= 100:  
    # do something

#4 多重比较

// C-like code  
if (genre_code == CODE_ROCK ||  
    genre_code == CODE_COUNTRY ||  
    genre_code == CODE_JAZZ) {  
    // do something  
}

# Python code  
if genre in ("rock", "country", "jazz"):  
    # do something

#5 列表推导式

// C-like code  
float* normalized_buf = malloc(sizeof(float) * buf_size);  
for (int i = 0; i < buf_size; i++)  
{  
    normalized_buf[i] = (float)(buf[i] / 255);  
}  
   
   
# Python code  
def normalize(x):  
    return (x/255)
	
normalized_buf = [normalize(x) for x in buf]

#6 将 Python 字典当做缓存

complex_calc_cache = {}  # create an empty dictionary

def complex_calc(m, n, t):  
    if (m, n, t) in complex_calc_cache:  
        return complex_calc_cache[(m, n, t)]  
    else:  
        # get result after time consuming calculation...  
        complex_calc_cache[(m, n, t)] = result  
        return result

Python 允许像(m, n, t) 这样的元组作为字典键。

#7 关键字参数

def init_worker(max_size=1000000, cache_size=1000,   
                timeout=30000, max_retry=10, encoding="utf-8"):  
    # ...  
    return worker
	
worker1 = init_worker(cache_size=2000)  
worker2 = init_worker(max_retry=3)

当函数参数比较多,比较长且带有默认值的时候,关键字参数使用起来会更加方便。

#8 读取文件

file_path = os.path.join("proj", "data", "address.txt")  
with open(file_path) as file_obj:  
	for line in file_obj:  
		# process one line, e.g. words = line.split()

通过使用 **with** open(), 在程序退出时,上下文管理 将会自动关闭文件。

#9 适用 HTTP

import requests  
import pprint    # Pretty Printer

response = requests.get("http://some.url/query")  
print("Response is:" + response.text)  
pprint.pprint(response.json())  # print in better format

#10 装饰器

import time

def my_decorator(func):  
    def wrap_profiler(*args, **kwargs):  
        start_time = time.time()  
        func(*args, **kwargs)  
        end_time = time.time()  
        interval = end_time - start_time  
        print(f"Function {func.__name__} takes {interval} seconds.")  
    return wrap_profiler
	
@my_decorator  
def my_test_func():  
    print("Hello world.")

当我们调用 my_test_func()函数时, 我们将得到如下结果:

Hello world.  
Function my_test_func takes 3.695487976074219e-05 seconds.

最后一个示例涵盖了更多的语法概念,包括 (1) 内部函数、(2) 任意参数列表、(3) 内置变量、(4) 作为一等公民的函数以及 (5) @ 语法糖。

你的 Pythonic 技巧是什么?很高兴在评论中看到您的见解!

翻译自:https://kimi-wh-sun.medium.com/how-to-make-your-python-code-pythonic-9ffda6d19c04

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10个让你的 Python 代码更具 pythonic 风格的示例 的相关文章

随机推荐

  • Ubuntu系统man命令中文汉化

    1 下载中文包 进入 opt xff0c 使用管理权限下载 xff1a wget https src fedoraproject org repo pkgs man pages zh CN manpages zh 1 5 1 tar gz
  • 文末彩蛋 | 这个 Request URL 长得好不一样

    有朋友拿到一个网站请求的链接问这要怎么解密 xff1f 很明显这不是加密的数据 xff0c 这是一张图片 base64 后的结果 xff0c 第一次写爬虫朋友遇到这样的请求 xff0c 可能需要琢磨一下这是什么东西 如果有遇到类似数据 xf
  • Redis(十) 布隆过滤器

    速记 为什么使用布隆过滤器 xff1f 1 为了省内存 xff0c 提高速率 2 因为1所以布隆过滤器不需要百分百正确 3 说存在不一定存在 xff0c 说不存在一定不存在 4 在解决缓存穿透的问题时 xff0c 拦截了大部分的请求 xff
  • 第五章:数学运算-statistics:统计计算-平均值

    5 5 statistics 统计计算 statistics模块实现常用的统计公式 xff0c 允许使用python的各种数值类型 xff08 int float xff0c Decimal和Fraction 来完成高效计算 5 5 1 平
  • 用proxychains4解决rosdep init问题教程

    在终端下载源码 sudo git clone https github com rofl0r proxychains ng git 进入安装目录 cd proxychains ng 配置 configure prefix 61 usr sy
  • 使用 TX2 和 realsense D435i 相机运行 ORBSLAM3

    非 ROS 版本 之后可能会更新 ROS 版本的 ORBSLAM3 配置指南 TODO 目录 TX2 刷机JetPack 4 6 1安装 realsense SDK 2 0编译 opencv 4 5 0编译 Pangolin 0 5编译运行
  • 解决 cv_bridge 与 opencv4 版本冲突问题

    解决了在 ROS melodic noetic 下 cv bridge 与 opencv4 版本冲突导致的 opencv 操作 导致 Segmentation fault core dumped 的问题 目录 问题描述解决方法参考 问题描述
  • 我对onSizeChange方法的源码解析

    如果当前的自定义控件是继承ViewGroup xff0c 那么在ViewGroup重写的layout方法中 xff1a 可知调用父类也就是View的layout方法 再看View的layout方法 xff1a 查看设置自己坐标的setFra
  • 5 个你不知道的关于 Python 类的技巧

    5 个你不知道的关于 Python 类的技巧 1 创建 一个 常量值2 多个类构造函数3 创建枚举4 迭代器5 以列表的形式访问一个类 Python 有许多强大的特性 xff0c 在处理类时提供了极大的灵活性 在这里 xff0c 我将向您展
  • 激光雷达和RTK的标定(无人小车)

    总结一下最近的标定工作 xff0c 标定平台是实验室的无人小车 xff0c 目标是实现激光雷达 lidar 和RTK的标定 xff0c 也就是求解lidar到RTK的位姿变换矩阵 采用的代码是ETH的lidar align https gi
  • 虚拟机安装Ubuntu20.04 + VCS2018

    虚拟机安装Ubuntu20 04 43 VCS2018 前言正文1 准备内容Vmware Workstation 16 prounbuntu 20 04 安装包vcs 43 scl 43 verdi等安装包 2 Ubuntu系统的安装ope
  • input里面file实现上传图片及预览功能

    在这里插入简单的HTML代码片 lt form action 61 34 34 gt 文件 xff1a lt input type 61 34 file 34 name 61 34 myFile 34 id 61 34 myFile 34
  • 创建ROS-wrapper

    创建ROS wrapper 对高博的ygz stereo inertial的开源算法添加ROS node源文件的编写CMakeLists文件的编写分目录下的CMakeLists完整CMakeLists路径 home fei devv ygz
  • 新买了块翼联的AX200的网卡,结果开移动热点的时候遇到了点问题

    买网卡这事的起因要从入手了switch说起 xff0c 直连网不是不能用 xff0c 就是太难用了 xff0c 下载个东西要几十个小时 xff0c 玩个马造2连地图都下载不了 然后试用了3天的网易uu加速器 xff0c 好用是真的好用 xf
  • HDU 1085(Holding Bin-Laden Captive!)

    题意 xff1a 有三种价值分别为 1 2 5 的硬币 xff0c 每一种分别由 a b c 个 xff0c 求这些硬币不能组成的最小价值 分析 xff1a 生成函数板子题 xff08 贴一个讲生成函数的链接https blog csdn
  • 大电流的走线和过孔

    工程师在设计的时候 xff0c 很容易忽略走线宽度的问题 xff0c 因为在数字设计时 xff0c 走线宽度不在 考虑范围里面 通常情况下 xff0c 都会尝试用最小的线宽去设计走线 xff0c 这时 xff0c 在大电流时 xff0c 将
  • c++ 实现基本数据结构代码

    数据结构是计算机科学的一个重要的分支 xff0c 主要研究如何有效地存储和组织数据以便于快速访问和操作 常见的数据结构有 xff1a 数组 xff1a 是一种线性的数据结构 xff0c 可以通过索引来访问数组中的元素 链表 xff1a 是一
  • Jetson开发实战记录(二):Jetson Xavier NX版本区别以及烧录系统

    Jetson开发实战记录 xff08 二 xff09 xff1a Jetson Xavier NX版本区别以及烧录系统 一 Jetson Xavier NX类型1 SD卡槽的版本 xff08 官方版本 xff09 2 带eMMC存储芯片的版
  • ZYNQ7000(AX7020)移植Linux操作系统(二):u-boot的编译和启动

    总述 我们已经在 PC 上已经安装了 Ubuntu 客户操作系统 xff0c 以及在 Ubuntu 操作系统里安装了 SDK 2015 4 工具 要想在 Zynq 平台上运行 Ubuntu 操作系统 xff0c 必项预先制作作镜像文件 xf
  • 10个让你的 Python 代码更具 pythonic 风格的示例

    10个让你的 Python 代码更具 pythonic 风格的示例 1 变量交换 2 函数返回元组 xff08 自动打包 解包 xff09 3 多重比较 4 多重比较 5 列表推导式 6 将 Python 字典当做缓存 7 关键字参数 8