第16篇,Python的其它知识

传递元组

如下

# 传递元组
def get_error_details():
    return (2,'details')

errnum,errstr = get_error_details()
print(errnum)
print(errstr)

# 快速交换两个变量
errstr,errnum = errnum,errstr
print(errnum)
print(errstr)

控制台

2
details
details
2

Process finished with exit code 0

a,b = <some expression>将表达式解释为具有两个值的一个元组。
快速交换两个变量的方法如上。

特殊方法

更所的特殊方法,请参考这里

# 特殊方法 举例说明

# __init__(self,...) 这一方法在新创建的对象被返回准备调用时被调用
# __del__(self) 这一方法在对象被删除之前调用(但是它的使用实际不可预测,所以避免使用)
# __str__(self) 当我们使用print函数时,或者str()被使用时就会被调用
# __it__(self,other) 当小于运算符(<)被使用时被调用。类似,使用其它所有运算符时都会有特殊方法被调用
# __getitem__(self,key) 使用x[key]索引操作时被调用
# __len__(self) 当针对序列对象使用内置len()函数时被调用
单语句块

我们已经见过每一个语句块都由其自身的缩进级别与其它部分相区分。但是如果语句块只包括单独的一行语句,那么我们可以在同一行指定它,比如条件语句和循环语句。
如下

flag = True
if flag: print('YES')

单个语句是在原地立即使用的,它不会被看做一个单独的块。

Lambda表格

lambda语句可以创建一个新的函数对象。从本质上说,lambda需要一个参数,后跟一个表达式作为函数体,这个表达式执行的值将作为这个新函数的返回值。
如下

# lambda表达式
point = [
    {'x':2,'y':3},
    {'x':4,'y':7}
]
point.sort(key=lambda i:i['x'])
print(point)
print("****************")
z = lambda x,y,z:x*y*z
print(z(999,95,82))

控制台输出

[{'x': 2, 'y': 3}, {'x': 4, 'y': 7}]
****************
77892210

Process finished with exit code 0

当我们需要编写一个函数,又不想为函数编写一个独立的def块时,就可以使用lambda表达式。

列表推导

列表推导用于从现有的列表中得到一份新的列表。当我们循环处理列表中的元素,并将其存储在一个新的列中中时,列表推导可以省下很多代码。
如下

# 列表推导
# 从已有列表中国推导出一份新的列表
listone = [2,3,4,5,6]
listtwo = [2*i*i for i in  listone if i>3]
print(listtwo)

控制台

[32, 50, 72]

Process finished with exit code 0
在函数中接收元组与字典

如下

# 在函数中接收元组与字典
# 接收元组
def powerSum(poewr,*ele):
    total = 0
    for i in  ele:
        print(i)
        total += pow(i,poewr)
    return  total

# 接收字典
def getkeyvalue(p,**dic):
    for k in  dic.values():
        print(k*p)
    print(dic)

print(getkeyvalue(3,a=3,b=4))
print('=====================')
print(powerSum(10,5,9,11))

控制台

9
12
{'a': 3, 'b': 4}
None
=====================
5
9
11
29433974627

Process finished with exit code 0

如上,我们使用*作为元组的前缀,函数所有的其它额外参数都将传递到ele中,并作为一个元组进行存储。**作为字典的前缀,额外的参数将被视为字典的键值对进行存储,并且,在传递参数时必须采用key=value的形式。

assert语句

assert用来断言Assert某件事是真的,如果不是真的,就会抛出AssertionError错误。
如下

# assert 语句
text = input('Please input content:')
assert  len(text) > 5

控制台

Please input content:qwert
Traceback (most recent call last):
  File "/Users/a1/Desktop/Python/PythonProjectFiles/More.py", line 62, in <module>
    assert  len(text) > 5
AssertionError

Process finished with exit code 1

如上,我们断言输入字符串的长度会大于5,当我们输入字符串长度小于等于5时,就会抛出AssertionError
相比捕获异常 以及定位问题或向用户显示错误信息然后退出,断言的优势更为明显。

装饰器

装饰器是应用包装函数的快捷方式,这有助于将某一功能与一些代码一遍又一遍的“包装”。如下,创建一个retry装饰器

from time import  sleep
from  functools import wraps
import logging

logging.basicConfig()
log = logging.getLogger('retry')

def retry(f):
    @wraps(f)
    def wrapped_f(*tup,**dic):
        MAX_ATTEMPTS = 5
        for attempt in range(1,MAX_ATTEMPTS + 1):
            try:
                return  f(*tup,**dic)
            except:
                log.exception("Attemp %s%s failed:%s",
                               attempt,
                              MAX_ATTEMPTS,
                              (tup,dic))
                sleep(2 * attempt)
        log.critical("All %s attemp failed: %s",
                     MAX_ATTEMPTS,
                     (tup,dic))
    return  wrapped_f

counter = 0

@retry
def saveToDatabase(ele):
    print("Write to a database or make a network call or etc.")
    print("This will be automatically retried if exception is thrown.")
    global  counter

    counter += 1
    
    # 前3次调用时抛出异常  
    # 第四次运行时讲正常工作(重试)
    if counter < 4:
        raise  ValueError(ele)

if not __name__ == 'main':
    saveToDatabase('Some bad value')

控制台

ERROR:retry:Attemp 15 failed:(('Some bad value',), {})
Traceback (most recent call last):
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 14, in wrapped_f
    return  f(*tup,**dic)
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 37, in saveToDatabase
    raise  ValueError(ele)
ValueError: Some bad value
Write to a database or make a network call or etc.
This will be automatically retried if exception is thrown.
ERROR:retry:Attemp 25 failed:(('Some bad value',), {})
Write to a database or make a network call or etc.
Traceback (most recent call last):
This will be automatically retried if exception is thrown.
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 14, in wrapped_f
    return  f(*tup,**dic)
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 37, in saveToDatabase
    raise  ValueError(ele)
ValueError: Some bad value
ERROR:retry:Attemp 35 failed:(('Some bad value',), {})
Write to a database or make a network call or etc.
Traceback (most recent call last):
This will be automatically retried if exception is thrown.
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 14, in wrapped_f
    return  f(*tup,**dic)
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 37, in saveToDatabase
    raise  ValueError(ele)
ValueError: Some bad value
Write to a database or make a network call or etc.
This will be automatically retried if exception is thrown.

Process finished with exit code 0

如上 retry装饰器,可以将它运行到任何函数中,如果在前三次运行中抛出任何错误,它将会尝试重新运行,直到最大运行次数5次,并且每次重新运行之间还会有一定时间的延迟。
关于装饰器,可以参考 onetwo

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,546评论 1 118
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,475评论 25 707
  • 第一次来这里,或许这里可以成为我写写随笔,随意发挥一些自己的见解亦或是小想法的地方吧!(因为心事很多,喜欢打打字写...
    姓王不姓黄阅读 590评论 8 3
  • 【点石成金】20170626 学习力6 Day42 画日记:关键词:爸爸 包子 指读贴在墙上的小...
    叶子ya豆子阅读 90评论 0 0