文档章节

Effective Python (Pythonic Thinking)

LeoDian
 LeoDian
发布于 2016/04/20 16:44
字数 775
阅读 48
收藏 0
  • Know the differences Between bytes,str and unicode

In Python 3, there are two types that represent sequences of characters: bytes and str. Instances of bytes contain raw 8-bit values. Instances of str contain Unicode characters. 

# to_str
def to_str(bytes_or_str):
    if isinstance(bytes_to_str, bytes):
        value = bytes_or_str.decode('utf-8')
    else:
        value = bytes_or_str
    return value    # Instance of str

# to_bytes
def to_bytes(bytes_or_str):
    if isinstance(bytes_to_str, str):
        value = bytes_to_str.encode('utf-8')
    else:
        value = bytes_to_str
    return value    # Instance of bytes

In Python 2, there are two types that represent sequences of characters: str andunicode. In contrast to Python 3, instances of str contain raw 8-bit values. Instances ofunicode contain Unicode characters. 

# to_unicode
def to_unicode(unicode_or_str):
    if isinstance(unicode_or_str, str):
        value = unicode_or_str.encode('utf-8')
    else:
        value = unicode_or_str
    return value    # Instance of unicode

# to_str
def to_str(unicode_or_str):
    if isinstance(unicode_or_str, unicode):
        value = unicode_or_str.decode('utf-8')
    else:
        value = unicode_or_str
    return value    # Instance of str

    如果你要读取/写入二进制数据至文件中,请使用”rb“或者”wb“:    

import os
with open('/tmp/random.bin', 'wb') as f:
    f.write(os.urandom(10))


  • Use List Comprehensions Instead of map and filter (用列表解析代替map和filter)

a = [1, 2, 3, 4]
squares = [x ** 2 for x in a]
squares = map(lambda x: x ** 2, a)

even_squares = [x ** 2 for x in a if x % 2 == 0]
alt = map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, a))

# 对调字典的key与value
chile_ranks = {'ghost': 1, 'habanero': 2, 'cayenne': 3}
rank_dict = {rank: name for name, rank in chile_ranks.items()}
chile_len_set = {len(name) for name in rank_dict.values()}


  • Consider Generator Expressions for Large Comprehensions(用生成器表达式代替大的列表解析)
value = [len(x) for x in open('/tmp/my_file.txt')]
print(value)

it = (len(x) for x in open('/tmp/my_file.txt'))
print(next(it))

# 生成器表达式可以由另外一个生成器表达式构成
roots = ((x, x**0.5) for x in it)
print(next(roots))


  • Prefer enumerate Over range 
# 当迭代一个列表,同时想知道当前元素的索引(计数)时;使用enumerate而不是range
flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']

# use range
for i in range(len(flavor_list)):
    print('%d: %s' % (i, flavor_list[i]))
# use enumerate
for i, flavor in enumerate(flavor_list):    # enumerate(flavor_list, 1)可为enumerate指定开始计数值
    print('%d: %s' % (i, flavor))


  • Use zip to Process Iterators in Parallel 
# 使用zip并行处理迭代器
names = ['Cecilia', 'Lise', 'Marie']
letters = [len(n) for n in names]

max_letters = 0
for name, count in zip(names, letters):
    if count > max_letters:
        longest_name = name
        max_letters = count

# 注意:在Python3中zip是一个元组生成器;在Python2中zip是一个由元组组成的列表。


  • Avoid else Blocks After for and while Loops 
# 避免在for与while循环之后使用else
# 1,在没有break的for/while循环结束后,会马上执行else中的语句
# 2,避免在循环之后使用else,因为else不确定是否执行
for i in in range(5):
    print i
else:
    print 'else run'
    
for i in range(5):
    break
else:
    print 'else not run'


  • Take Advantage of Each Block in try/except/else/finally
# 使用finally 去可靠的关机文件句柄、socket等
handle = open('/tmp/random_data.txt')    # May raise IOError
try:
    data = handle.read()    # May raise UnicodeDecodeError
finally:
    try:
        handle.close()    # Always runs after try
    except Exception:
        pass

# 使用else 减少try block里面的代码量、提高可读性
# 如:从字符串中加载一个json dict并返回某个key的value
def load_json_key(data, key):
    try:
        result_dict = json.loads(data)    # May raise ValueError
    except ValueError as e:
        raise KeyError from e
    else: 
        return result_dict[key]    # May raise KeyError

# 
UNDEFINED = object()

def divide_json(path):
    handle = open(path, 'r+')    # May raise IOError
    try:
        data = handle.read()    # May raise UnicodeDecodeError
        op = json.loads(data)    # May raise ValueError
        value = (op['numerator'] / op['denominator'])    # May raise ZeroDivisonError
    except ZeroDivisionError as e:
        return UNDEFINED
    else:
        op['result'] = value
        result = json.dumps(op)
        handle.seek(0)
        handle.write(result)    # May raise IOError
        return value
    finally:
        try:
            handle.close()    # Always runs
        except Exception:
            pass








© 著作权归作者所有

下一篇: 简明 lsof
LeoDian
粉丝 2
博文 4
码字总数 3271
作品 0
杭州
系统管理员
私信 提问
Pythonic到底是什么玩意儿?

这是几个月前在 EuroPython 邮件列表(主要用来组织和计划 EuroPython 会议的邮件列表)出现的问题。这是一个非常有意思的问题,我看到这个词被无数次地使用,但鲜有人尝试解释它的含义。在这...

陶邦仁
2013/01/15
426
2
对比几段代码,看看你是 Python 菜鸟还是老鸟

Python 里有个小彩蛋: 在 Python Shell 里输入 这段话被称作“Python 之禅”(The Zen of Python),它列举了一些 Python 所推崇的理念,比如: 优美胜于丑陋 明确胜于隐晦 简单胜于复杂 …...

crossin
03/05
57
0
代码整洁之道-编写Pythonic代码

很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之养成了一种习惯。对此呢,我特意收集了一些适合所有学习...

陈祥安
06/13
0
0
Python|19个优雅的Python编程技巧,涨姿势

Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀...

糖宝lsh
2018/12/04
81
0
Pythonic PHP Code Formatter v0.6,代码格式化工具

项目创意来源于2月22日Twitter的一个热门的黑Java的段子,看到段子后当即动手,实现了这个 Pythonic PHP Code Formatter。 这个工具可以自动化地把PHP中讨厌的分号以及花括号对齐到右侧(原文...

lincanbin
2015/02/24
2.4K
25

没有更多内容

加载失败,请刷新页面

加载更多

Nervos CKB 脚本编程简介[1]:验证模型

CKB 脚本编程简介[1]: 验证模型 本文作者:Xuejie 原文链接:Introduction to CKB Script Programming 1: Validation Model 本文译者:Jason,Orange 译文链接:https://talk.nervos.org/t/c...

NervosCommunity
39分钟前
6
0
消息中间件——RabbitMQ的高级特性

前言 前面我们介绍了RabbitMQ的安装、各大消息中间件的对比、AMQP核心概念、管控台的使用、快速入门RabbitMQ。本章将介绍RabbitMQ的高级特性。分两篇(上/下)进行介绍。 消息如何保障100%的...

Java架构师ya七
今天
9
0
如何编写高质量的 JS 函数(1) -- 敲山震虎篇

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/7lCK9cHmunvYlbm7Xi7JxQ 作者:杨昆 一千个读者,有一千个哈姆雷特。 此系列文章将会从函数的执行机制、鲁棒性、函...

vivo互联网技术
今天
7
0
学会这5个Excel技巧,让你拒绝加班

在网上,随处都可以看到Excel技巧,估计已看腻了吧?但下面5个Excel技巧会让你相见恨晚。关键的是它们个个还很实用 图一 技巧1:快速删除边框 有时当我们处理数据需要去掉边框,按Ctrl+Shif...

干货趣分享
今天
11
0
JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部