学会python这十个语言技法,让你有上手风范

news2024/11/19 1:23:26

如何让你的代码更有python味?

大部分编程语言都有共性,也有个性。下手害怕个性,视为异端,抵触之;上手善用个性,欣欣然,妙用之。

1、三元表达式

别抱怨python没有三元表达式,请看:

intro = None
introduction = "haha" if intro == None or len(intro) == 0 else intro

含义隽永,妙味无穷。千言万语,尽在一行中。

2、*和**的运用

定义:一个星号和两个星号分别对list和dict进行packing和unpacking,
请听题:

v, *end = [10, 20, 30]

# gives v= 1, end = [2, 3]

v, *middle, z= [1, 2, 3, 4]

# gives v= 1, middle = [2, 3], z= 4

v, *middle, z= [1, 2, 3, 4]

# gives v= 1, middle = [2, 3]

传可变参数也是用它们:

def add(*args):
    sum = 0
    for arg in args:
      sum += arg

    return sum

def say(**kwargs):
    for k,v in kwargs.items():
        print(f"{k} = {v}")

有了这两个函数,我们可以这样用:

add(1, 2)
add(1, 2, 3)

say(username='user1', passwd='123')
say(username='user1', passwd='123', age=10)

多方便,多神奇啊。

3、列表的使用

列表能运算,能带表达式,能lambda,请听题:

listOfNones = [None] * 6

# gives [None, None, None, None, None, None]

listOfFives = [[5]] *5

# gives [[5], [5], [5], [5], [5]]
filtered_list = [item for item in sequence if item != x]

## to avoid generating a new object, use generators

filtered_list = (item for item in sequence if item != x)

result = list(map(lambda x:x**2, [i for i in range(3)]))

4、妙用yield

用yield而不是return语句,能改善程序结构,提高执行效率。yield把数据含在嘴里,迭代一次,就往外吐一次数据。

定理:

  • 含有yield的函数叫一个生成器
  • 一个函数可以有多个yield语句
  • 生成器在迭代时才会做真正的计算,每迭代一次就执行一次
def calculate(size):
  result = []
  for i in range(size):
    result.append(i**2)
  return result
for val in calculate(1_000_000):
  print(val)

改为:

def calculate(size):
  for i in range(size):
    yield i**2
for val in calculate(1_000_000):
  print(val)

这样更节省内存。
典型的使用案例:scrapy中做网页抓取时,每遇到一个url链接,就yield一把,不断往外"吐"链接,如此循环下去,就形成了深度优先遍历。

4、巧用context manager

Python中,我们通常在两类代码块中分配资源:

  • try … finally
  • with
    例如读大文件的典型写法:
with open("data.txt", "r") as f:
  text = f.read()

采用context manager能帮我们管理资源申请和释放:

import contextlib
@contextlib.contextmanager
def db_handler():     
  try:         
    stop_db()         
    yield     
  finally:        
    start_db()

with db_handler():     
  db_backup()

这样等价于:

try:         
    stop_db()         
    db_backup()     
  finally:        
    start_db()

5、活用Namespace and Scope

在这里插入图片描述
例子待补充(TODO)

6、记得用def repr(self) -> str:方法

好处是你在日志中方便打印你的类的内容:

class User():
   def __init()__:
       self.username = ''
       self.passwd = ''
   def __repr__(self) -> str:
      return f"my name is {self.username}, passwd is {self.passwd}"
      
logger.debug(f"the user is :{user}")

类似于序列化一个对象吧。

7、注意用Mutable 缺省参数

看例子就明白:

def add_to_shopping_cart(food, shopping_cart = []):
  shopping_cart.append(food)
  return shopping_cart
print(add_to_shopping_cart("egg"))
# ["egg"]
print(add_to_shopping_cart("milk"))
# ["egg","milk"]
def add_to_shopping_cart(food, shopping_cart=None):
  shopping_cart = shopping_cart or []
  shopping_cart.append(food)
  return shopping_cart
print(add_to_shopping_cart("egg"))
# ['egg']
print(add_to_shopping_cart("milk"))
# ["milk"]

8、学会用传参技法

  • Positional Arguments: These arguments are parts of the function’s meaning. They appear in the order in which they were written in the original function definition. For example, send_email(title, recipient, body).
  • Keyword Arguments: Otherwise known as kwargs, these come in handy when dealing with a function that has many arguments. In that case, kwargs can be used with default values. For example, send_message(message, recipient, cc=None).
  • Arbitrary Arguments Tuple: If your function needs an undefined number of arguments, you can use the *args construct to pass a tuple of arguments to the function. For example, def calc_ave(*nums). The nums will be a tuple with as many values as the user wants.
  • Arbitrary Keyword Argument Dictionary: Similar to the arbitrary argument tuple, if a function requires an undetermined number of named arguments, you can use the **kwargs construct.

9、此处无声

def collect_account_ids_from_arns(arns):
    collected_account_ids = set()
    for arn in arns:
        matched = re.match(ARN_REGEX, arn)
        if matched is not None:
            account_id = matched.groupdict()["account_id"]
            collected_account_ids.add(account_id)
    return collected_account_ids
def collect_account_ids_from_arns(arns):
    matched_arns = filter(None, (re.match(ARN_REGEX, arn) for arn in arns))
    return {m.groupdict()["account_id"] for m in matched_arns}
def collect_account_ids_from_arns(arns):
    return { matched.groupdict()["account_id"] for arn in arns if (matched := re.match(ARN_REGEX, arn)) is not None }

10、学会设计和用Python接口

歌曰:

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.

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

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

相关文章

《大数据导论》之数据的概念、类型和组织形式

目录 说在前面 一、数据的概念 二、数据类型 ​三、数据组织形式 说在前面 大数据时代悄然来临,带来了整个信息技术发展的巨大变革,并深刻影响着社会生产和人们生活的方方面面。全球范围内,世界各国政府也非常重视整个大数据的研究和产业…

hadoop pig-0.17.0 安装配置

下载Apache Pig 首先,从以下网站下载最新版本的Apache Pig,下载Pig步骤取自W3C:Pig安装教程 步骤1 打开Apache Pig网站的主页。在News部分下,点击链接release page(释放),如下面的快照所示。 步…

解决git中出现的“bash syntax error near unexpected token ’(‘”错误

今天来分享一篇关于我在git使用过程中出现的一个错误。 错误信息: bash: syntax error near unexpected token (’ 翻译过来就是提示我在’(这里有错误,而这个错误是我在使用git commit提交时候产生的,我当时是这么写的: git c…

java中Optional的应用,以及map和flatMap的区别

关于Option的介绍可以看深入理解java8中的Optional 类就可以了,但是复杂一点的使用在网上却没有搜到,这里结合我开发时遇到的真实案例来讲一下Option的使用。 1.案例一 在真实业务操作过程中,都是对象里面套对象,这边先简单定义操…

flink window 框架详细解读

1. dataStream window group window time window 基于时间驱动 滚动时间窗口 tumble time window 滑动时间窗口 sliding time window 会话时间窗口 session time window count window 基于数据驱动 滚动计数窗口 tumble count window 滑动计数窗口 sliding count window 2. s…

皕杰报表之雷达图

雷达图(又可称为戴布拉图、螂蛛网图)是数据分析报表的一种。即将各项数据分析所得的数字或比率,就其比较重要的项目集中划在一个图表上,来表现一组数据的各项数据比率的情况,使用者能一目了然的了解这个数据的指标的变…

LeetCode中等题之通过最少操作次数使数组的和相等

题目 给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。 每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1 到 6 之间 任意 的值(包含 1 和 6&#…

计算机组成大题分析(三)

假定计算机 M 字长为 16 位,按字节编址,连接 CPU 和主存的系统总线中地址线为 20 位、数据线为 8位,采用 16 位定长指今字,指令格式及其说明如下: 其中,op1-op3 为操作码,rs,t 和 rd 为通用寄存…

【计算机视觉+CNN】keras+ResNet残差网络实现图像识别分类实战(附源码和数据集 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、深度卷积神经网络模型结构 1:LeNet-5 LeNet-5卷积神经网络首先将输入图像进行了两次卷积与池化操作,然后是两次全连接层操作,最后使用Softmax分类器作为多分类输出,它对…

MySQL插入汉字报错的解决方案

MySQL插入汉字报错的原因是字符集的问题,MySQL默认使用的是Latin(拉丁文)字符集,可以在创建数据库时指定其字符集:CREATE DATABASE test DEFAULT CHARACTER SET utf8 或者修改MySQL的配置文件,可以参考以下…

Qt事件循环嵌套,BlockingQueuedConnection与QWaitCondition比较

前言: 之前写过有关事件循环和条件变量的博客: Qt使用事件循环,信号,stop变量,sleep阻塞,QWaitConditionQMutex条件变量,退出子线程工作_大橘的博客-CSDN博客_qt stop函数 Qt事件循环&#x…

Unity3D导出Android工程中使用并交互

, 目录 1,版本信息 2,前期准备 Unity方面: Android方面: 3,Android与Unity3D交互 1,版本信息 unity2020 android studio 2021 *不要用android studio 2020系列,存在不能导入Library的b…

Spring学习 | Bean作用域生命周期

文章目录一、作用域1.1 xml文件中配置1.2 注解配置二、生命周期2.1 四个阶段2.2 添加后置处理器2.3 实现aware类型接口2.4 Bean 初始化的方式2.5 Bean 销毁的方式2.6 测试程序学习视频🎥:https://www.bilibili.com/video/BV1Vf4y127N5 一、作用域 ❓ 引入…

Linux系统中裸机按键中断的驱动方法

大家好,今天主要和大家聊一聊,如何实现按键中断的驱动​方法。 目录 ​第一:外部中断头文件实现 ​第二:外部中断源文件的具体实现 ​第三:编写对应的main.c函数 ​第一:外部中断头文件实现 #ifndef _…

基于keras平台CNN神经网络模型的服装识别分析

在许多介绍图像识别任务的介绍中,通常使用着名的MNIST数据集。 最近我们被客户要求撰写关于图像识别的研究报告,包括一些图形和统计输出。但是,这些数据存在一些问题: 1.太简单了。例如,一个简单的MLP模型可以达到99…

Java搭建宝塔部署实战毕设项目springboot客户管理系统源码

大家好啊,我是测评君,欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目,springboot客户管理系统源码,感兴趣的朋友可以自行下载搭建测试。 技术架构 技术框架:SpringBoot MySQL5.7 mybatis shiro Lay…

DDR4时序标准规范(一)

DDR4时序标准规范引脚描述DDR4 SDRAM寻址DDR4架构的模块描述功能描述简化状态机基本功能复位和初始化程序上电和初始化顺序电压稳定后的复位初始化顺序无控制的下电顺序引脚描述 标志类型功能CK_t, CK_c输入Clock: CK_t和CK_c是差分时钟输入。所有的地址和控制输入信号在CK_t的…

主成分分析(PCA)原理及R语言实现及分析实例

主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分。最近我们被客户要求撰写关于主成分分析(PCA)的研究报告,包括一些图形和统计输出。…

Vagrant搭建Centos

1.下载安装vagrant 01访问Vagrant官网 ​ https://www.vagrantup.com/ 02 点击Download ​ Windows,MacOS,Linux等 03 选择对应的版本 04 傻瓜式安装 05 命令行输入vagrant,测试是否安装成功,显示如下: 2.下载安装virtua…

半解析快速傅里叶变换

我们提出了一种处理傅里叶变换的方法,其并不需要二次多项式相位项的抽样,而是用解析的方法处理。我们提出该理论的同时也给出了几个例子证明其潜力。 1.简介 物理光学建模需要频繁地从空间转换到角频域,反之亦然。这可以由电场和磁场分…