前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python进阶教程(一)

Python进阶教程(一)

作者头像
吕海峰
发布于 2018-04-03 07:43:30
发布于 2018-04-03 07:43:30
1.1K00
代码可运行
举报
文章被收录于专栏:BrianBrian
运行总次数:0
代码可运行

概述

hi,朋友们大家好,今天将英文原著作者 @yasoob《Intermediate Python》进行翻译和在工作中使用的Python技巧进行了总结。Gitbook里面有翻译的版本,大家可以下载下来看看。我今天主要是将该英文原著翻译成适合自己的理解的语言,并附加一些自己在工作中使用Python的技巧。废话少说,下面我们依次来学习一下@yasoob的原著。

Intermediate Python 中译

如果在翻译过程中有问题或者code无法运行,还请各位大侠指正。

*args和**kwargs

我们在函数定义时,会经常使用*args和**kwargs这两个魔法变量,特别是函数参数数量不确定或参数较多时。当然*args和**kwargs这两个name并不是惟一的name,可以改成*as和**kwas,只要在命名前面加上修饰符*和**即可。我们先来看一下*args。

*args
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def test_args_kwargs(name,*args):
    print("frist arg: ",name)
    for arg in args:
        print("another arg through *argv: ",arg)

test_args_kwargs("brian","eric","rose")
#输出为
frist arg:  brian
another arg through *argv:  eric
another arg through *argv:  rose

我们也可以通过参数列表进行传递,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
names=("brian","eric","rose")
test_args_kwargs(*names)
frist arg:  brian
another arg through *argv:  eric
another arg through *argv:  rose
**kwargs

将不定长度的键值对作为参数传递给函数,我们来看一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def greet_me(**args):
    for key,value in args.items():
        print("{0}=={1}".format(key,value))

greet_me(name="brian",age=20,sex="男")
#输出为
name==brian
age==20
sex==

或者也可以这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
person = {"name":"brian","age":20,"sex":"男"}
greet_me(**person)
#输出为
name==brian
age==20
sex==
如何使用

在很多场景里面都大量使用比如: 1.装饰器 2.函数定义 3.单元测试 4.猴子补丁(在运行时修改某些代码),在英文版本里面主要介绍了通过猴子补丁修改API来进行测试。 ……

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import someclass

def get_info(self,*args):
	return "Test Data"
someclass.get_info=get_info

Debugging

我们在生产和测试环境很少安装IDE进行调试的,如有有紧急需要修改或者出现问题如何快速排查问题和定位问题是非常重要的意见事情,也是主要衡量一个工程师水平的一个标准。那么在Python是如何做呢? 1.日志,不仅在关键的业务处理进行相应的日志输出,也要在入口和出口进行详细的日志处理。 2.Debugging,我们可以通过pdb、ipdb和jupyter进行有效的调试。 3.python docstring一定规范写好,方便调试和定位问题,特别是研发人员的流失比较严重时。 ……

我们今天来看一下通过pdb通过命令行和嵌套debug代码这两种方式都可以调试代码。我们来看一下, 1.命令行运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m pdb test.py

2.嵌套代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pdb
def method(*args,**kwargv):
	pdb.set_trace()
	...
method(name="sasa")

当函数调用时进入debug模式。 无论是命令行模式还是嵌套代码模式所有调试代码的命令都是一样的,主要有如下几个快捷键:

  • c:继续在当前程序上下文执行直到遇到断点或者trace位置为止,即继续执行。
  • w:显示当前执行程序上下文信息。
  • a:打印当前函数的参数列表。
  • s:执行当前代码行。
  • n:执行下一行的代码。

Generators

Generators(生成器)很多教程在讲解Generators都会先讲解Iter(迭代器),因为生成器大多数场景都是基于迭代器的。所以我们先来了解学习一些迭代器相关的内容。

  • Iterable(可迭代对象):Python即对象,呵呵。Python的任意对象定了返回__iter__方法或者支持下标的__getitem__方法,它就是一个可迭代的对象。可迭代对象就是提供迭代器的任何对象
  • Iterator(迭代器):一般是指定义了__next__方法的对象。
  • Iteration(迭代):字面意思,不言而喻。实在不理解的,可以简单的理解为循环。

Generators也是一种迭代器,只不过你只能对其只能迭代一次,它并不是列表这种集合类型的数据保存在内存中,而是保存的是运行时的某个值。主要是通过yield来终止并暂存运行时栈,相当于保护现场进而为下次迭代提供记录和便利。特别一次性不需要全部结果集时显得非常重要。 我们来看一个简单的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fibon(n):
    a=b=1
    for i in range(n):
        yield a
        a,b=b,a+b

for i in fibon(3):
    print(i)
#输出为
1
1
2
#通过next方法来进行获取生成器的下一个迭代
gen_fibon = fibon(3)
print(next(gen_fibon))
print(next(gen_fibon))
print(next(gen_fibon))
#输出结果为
1
1
2
#如果我们再进行下一个迭代时,会出现Exception,这说明我们的迭代已经完成,生成器已经没有再生成Python对象。
print(next(gen_fibon))
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-18-5f779bae9fed> in <module>()
----> 1 next(gen_fibon)

StopIteration:

我们来看一下python的string类型是不是可以直接通过迭代器来获取元素。比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name="brian"
next(name)
#输出结果为,告诉我们python的str了O型不是一个迭代器,那么就无法进行迭代。所以我们需要将str对象模型变成可迭代的python对象数据模型,只需要通过iter(object)方法即可。
TypeError: 'str' object is not an iterator
#代码修改
iter_name = iter(name)
next(iter_name)

iter(object)是将一个可迭代的对象变为一个迭代器对象,从而通过next来获取数据。

map,filter and reduce

map,filter,reduce这三个函数式python的buildin函数,是一个开箱即用的函数,更是Python提供面向函数编程的一个优势。我们先来看一下这三个函数的原型:

  • map(function_apply,array/list_inputs)
  • filter(function_apply,array/list_inputs)
  • reduce(function_apply,array/list_inputs)
map

map在处理并行计算提供了极大的便利,巧妙的使用map可以使自己的application变得快速和代码优化。我们先看一个简单的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
temp=[2,7,14,18]
list(map(lambda x: x**2,temp))
#输出结果为:
[4, 49, 196, 324]

lambda 函数式python的匿名函数,处理逻辑简单开箱即用的“一行函数”。,当然我们也可以将输入统一,具体行为或者业务不一致的code分装成函数,将具体执行各自的任务和逻辑单元。比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add(x):
    return x+x

def multiply(x):
    return x*x
funcs=(add,multiply)

for i in range(5):
    print(list(map(lambda func:func(i),funcs)))
#输出为
[0, 0]
[2, 1]
[4, 4]
[6, 9]
[8, 16]
filter

filter这是一个过滤的build-in函数,它的作用主要在于过滤行为。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nums=range(-5,5)
less_than_zero=list(filter(lambda x:x<0,nums))
#输出为
[-5, -4, -3, -2, -1]

在后面的我们会介绍列表推导式也很方便,我可以改一下该例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list(i for i in nums if i<0)
#输出结果为同样的
reduce

reduce是将列表结果进行规约处理的,又叫“规约函数”.我们来看一下处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from functools import reduce
print(reduce(lambda x,y:x+y,(2,3,4,5)))
##输出为
14

set data struct

python中的set数据结构是等价于数学意义上的集合。数学意义上的集合最重要的性质有:唯一性,可重复性,无序性。那么在Python的set数据结构中数据元素也是表现如此。我们来看一个得到重复元素的例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str_nums=('a','a','b','c','c','c','d','e','f')
duplicates=set([x for x in str_nums if str_nums.count(x)>1])
print(duplicates)
{'a', 'c'}
当然你也可以使用collection的Counter去处理
from collections import Counter
print(Counter(str_nums))
##输出为
Counter({'a': 2, 'b': 1, 'c': 3, 'd': 1, 'e': 1, 'f': 1})

和set相关的操作自然想到交集、并集合差集。下面我们依次看一下Python提供的API。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
colors=set({'red','yellow','green'})
input_colors=set({'red','blue'})
#交集API
print(input_colors.intersection(colors))
#输出
{'red'}
#差集API
print(input_colors.difference(colors))
#输出
{'blue'}
#并集API
print(input_colors.union(colors))
#输出
{'blue', 'green', 'red', 'yellow'}

值得注意的是set的定义是通过{}来定义的或者通过set()初始化来定义。

三元运算符

三元运算符和其它语言的三元运算符所表达的语义是相同的,只是形式不一样。我们来看下: condition_true if condition else condition_is_false

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
flag = True
print("Brian" if flag else "Not Brian")
#输出
Brian

总结

由于内容较多,所以分成三个博客篇幅来介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 易混淆点
对于刚开始学习Python的读者,一定在编写代码的时候,遇到过这个问题。他们到底是怎么回事呢?且听我一一道来。
花落花相惜
2021/12/06
2.2K0
Python进阶(一)
1、args 和 *kwargs *args *args 是⽤来发送⼀个⾮键值对的可变数量的参数列表给⼀个函数. python def test_var_args(f_arg, *argv): print("first normal arg:", f_arg) for arg in argv: print("another arg through *argv:", arg) test_var_args('yasoob', 'python', 'eggs', 'test
MiChong
2020/09/24
5660
Python进阶(一)
Python进阶教程(二)
概述 在上一篇博客中,我们介绍了Python进阶教程(一),还有一些新的技巧没有翻译完,我们下面来继续我们的翻译。 Intermediate Python 中译(二) Decorators Decorators装饰器是Pytho非常重要的特性,相当于Java注解功能。装饰器是修饰函数的一种语法特性,可以使其功能发生一些改变。在Python函数也是第一等公民,可以直接赋值对象和使用。 def hi(name="brian"): return "hi,"+name print(hi()) #输出 hi
吕海峰
2018/04/03
1.8K0
Python进阶笔记
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。一般是利用原有的数据结构来生成新的列表。
py3study
2020/01/03
1.1K0
【Python基础编程】迭代器、生成器、装饰器与闭包全攻略
上篇文章将了python多态,类属性等知识,这篇文章了解一下python的三器一包:迭代器、生成器、装饰器和闭包
易辰君
2024/11/07
4500
Generators生成器
首先让我们了解迭代器iterators。 根据维基百科,迭代器iterators是一个对象,使得程序员能够遍历一个容器,特别是list。 但是,迭代器执行遍历并访问容器中的数据元素,但不执行迭代。 你可能会感到困惑,所以让我们慢一点。 有三个部分即:
Helloted
2022/06/06
5000
Python的这些高级用法你都知道吗?
python高级用法Python很棒,它有很多高级用法值得细细思索,学习使用。本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式、迭代器和生成器、装饰器。
7537367
2020/08/06
1.3K0
盘一盘 Python 系列 1 - 入门篇 (下)
Python 里函数太重要了 (说的好像在别的语言中函数不重要似的)。函数的通用好处就不用多说了吧,重复使用代码,增强代码可读性等等。
用户5753894
2019/07/05
1.3K0
盘一盘 Python 系列 1 - 入门篇 (下)
理解迭代器,生成器,yield,可迭代对象
在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水,我将用一篇文章试图将这些概念以及它们之间的关系捋清楚。
marsggbo
2019/08/14
5870
理解迭代器,生成器,yield,可迭代对象
[长文] 学Python不用培训班,一篇文章带你入门
最近有许多小伙伴后台联系我,说目前想要学习Python,但是没有一份很好的资料入门。一方面的确现在市面上Python的资料过多,导致新手会不知如何选择,另一个问题很多资料内容也很杂,从1+1到深度学习都包括,纯粹关注Python本身语法的优质教材并不太多。
TechFlow-承志
2020/05/21
8990
[长文] 学Python不用培训班,一篇文章带你入门
深入浅出一下Python函数的核心概念与进阶应用
存在函数作为参数传递给函数,并且又不想让外界访问,而且参数函数足够简单,即可以定义为匿名函数(lambda表达式)
盛透侧视攻城狮
2025/04/14
1230
深入浅出一下Python函数的核心概念与进阶应用
Python笔记
import functools import operator mul2 = lambda x: 2 * x print(mul2(3)) print(list(map(lambda x: 3 * x, [1, 2, 3, 4]))) print(list(filter(lambda x: x % 3 == 0, [1, 2, 3, 4]))) print(functools.reduce(operator.add, [1, 2, 3, 4, 5], 5))
py3study
2020/01/16
4000
python核心知识汇总(精编版)
你好啊,我是阿巩。转眼已连续更新一周了,可咱毕竟是讲Python的公众号,不来点Python基础干货就有些说不过去,就像茶馆里没有茶、犬舍里没有狗子、老婆饼里没有老婆(都什么乱七八糟的比喻?!)之前有写过篇万字长文,今天来根据面试常问的内容整理下,做个精编版。日拱一卒,让我们开始吧!
才浅Coding攻略
2022/12/12
1.5K0
英伟达小姐姐的Python隐藏技巧合集,推特2400赞,代码可以直接跑
常常发资源的英伟达工程师小姐姐Chip Huyen,又发射了一套Python隐藏功能合集。
Python数据科学
2019/10/28
3300
英伟达小姐姐的Python隐藏技巧合集,推特2400赞,代码可以直接跑
python_functions_part1_cn
在 Python 中,函数是构建程序的一个重要部分,它允许你封装逻辑并高效地重用代码。函数是组织良好的、可重复使用的代码块,用于执行单一的、相关的操作。函数为的应用提供了更好的模块化能力,并提高了代码的重用性。
半截诗
2024/10/14
1130
对Python老司机99%有帮助的简明语法总结乱编
本文由马哥教育Python实战开发班6期学员推荐,转载自互联网,作者为赖笔小新,感谢作者的辛苦付出和贡献。 最近发现进入python群的朋友都在你是如何自学python语法的,每当被问到这个问题时,我内心是坦荡的,因为我不知道到底我接下来说的这些话会给看到的各位带来什么? 虽然大家已经对Python已经有了一个初步认识 了,但是我还不得不说关于Python语法的一些事,以便于我这个装逼的过程顺利的完成。 ————!!! 只针对有经验开发人员 ---- 简单输入输出 ---- 输出 print 10
小小科
2018/05/03
1.4K0
对Python老司机99%有帮助的简明语法总结乱编
python迭代器、生成器、装饰器
可以直接作用于for循环的对象统称为可迭代对象,即Iterable。   # 一是集合数据类型,如list、tuple、dict、set、str等;   # 二是generator,包括生成器和带yield的generator function。
用户1432189
2018/09/05
8980
python迭代器、生成器、装饰器
流畅的 Python 第二版(GPT 重译)(九)
迭代对于数据处理是基础的:程序将计算应用于数据系列,从像素到核苷酸。如果数据不适合内存,我们需要惰性地获取项目——一次一个,并按需获取。这就是迭代器的作用。本章展示了迭代器设计模式是如何内置到 Python 语言中的,因此您永远不需要手动编写它。
ApacheCN_飞龙
2024/03/21
3250
流畅的 Python 第二版(GPT 重译)(九)
Python基础常见面试题总结[通俗易懂]
以下是总结的一些常见的Python基础面试题,帮助大家回顾基础知识,了解面试套路。会一直保持更新状态。 PS:加粗为需要注意的点。
全栈程序员站长
2022/11/19
2.4K0
Python基础常见面试题总结[通俗易懂]
Python高级
class ClassName(Base1,Base2):在类的定义中,括号中的为父类。__init__ : 构造函数,在生成对象时调用。双下划线开头的为私有属性或私有方法。所有方法的第一个参数都为self
孔西皮
2023/10/18
2160
相关推荐
Python 易混淆点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验