网址

http://docs.python-guide.org/en/latest/

Reuqests库的作者写的经验

1. 项目需要一个好的结构

https://www.kennethreitz.org/essays/repository-structure-and-python

https://github.com/kennethreitz/samplemod

2. 组织糟糕的项目的一些标志(Some signs of a poorly structured project include):

2.1 多重和混乱的循环依赖(Multiple and messy circular dependencies)

furn.py

class Table():

    def isdoneby():
pass class Chair(): def isdoneby():
pass

workers.py

class Carpenter():
def whatdo():
pass

如果table.isdoneby()依赖import Carapenter才能执行;相反地,carpenter.whatdo()又要依赖import Table和Chiar。如果一开始就import,出现循环引入。

一个能解决问题但是不好的技巧是在方法或者函数里import。

2.2 隐藏的耦合(Hidden coupling)

如果Table内部的改变都使Carpenter的某些test cases不通过,那么Table和Carpenter的耦合性过大,Table的内部改变影响到Carpenter。

2.3 重度使用全局变量、状态、上下文(Heavy usage of global state or context)

2.4 面条代码(Spaghetti code)和馄饨代码(Ravioli code)

https://blog.csdn.net/godsme_yuan/article/details/6594013

面条代码:冗长,控制结构复杂(例如充满if,for),混乱而难以理解的代码。本人觉得,在编辑器里这些代码有非常多的guidelines垂下来,非常形象的”面条“。

馄饨代码:程序由许多小的,松散耦合的部分(方法,类,包等)组成。没有遵循高内聚,低耦合。书中举了个例子:如果你不知道什么时候用必须用FurnitureTable,AssetTable和TableNew,那么这些代码就是混沌代码一块一块的,很松散。

3. Module的艺术

3.1 Being able to tell immediately where a class or function comes from, as in the modu.func idiom, greatly improves code readability and understandability in all but the simplest single file projects.

3.2 In many languages, an include file directive is used by the preprocessor to take all code found in the file and‘copy’ it into the caller’s code. It is different in Python: the included code is isolated in a module namespace, whichmeans that you generally don’t have to worry that the included code could have unwanted effects, e.g. override an

existing function with the same name (即import module, 可用module.func)

3.3 不要用from module import *

4. package的艺术

4.1 文件夹里有__init__.py就视作一个包

4.2 A file modu.py in the directory pack/ is imported with the statement import pack.modu. This statement will look for an _init_.py file in pack, execute all of its top-level statements. Then it will look for a file named pack/modu.py and execute all of its top-level statements. After these operations, any variable, function, or class defined in modu.py is available in the pack.modu namespace.

4.3 当项目复杂性上升的时候,可能有sub-packages或者sub-sub-packages在一个很深的目录层次结构里面(包里有包,嵌套关系)。这种情况下,import一个在很深层次的包里的module时,会执行全部_init_.py文件(files);所以,如果包(package)和包里的包(sub-package)不共享代码,最好把__init__.py置空。

4.4 用import very.deep.module as mod 代替 import very.deep.module

5. Pure function

Pure functions are more efficient building blocks than classes and objects for some architectures because they have no context or side-effects

6. 装饰器(Decorators)

6.1 A decorator is a function or a class that wraps (or decorates) a function or a method. The ‘decorated’ function or method will replace the original ‘undecorated’ function or method. Because functions are first-class objects in Python, this can be done ‘manually’, but using the @decorator syntax is clearer and thus preferred.



6.2 This mechanism is useful for separating concerns and avoiding external un-related logic ‘polluting’ the core logic of the function or method.

6.3 A good example of a piece of functionality that is better handled with decoration is memoization or caching: you want to store the results of an expensive function in a table and use them directly instead of recomputing them when they have already been computed. This is clearly not part of the function logic.

7. 上下文管理(Context Managers)

7.1 A context manager is a Python object that provides extra contextual information to an action. 用with语句.

with open('file.txt') as f:
contents = f.read()

7.2 有两种实现方法:class和generator. Since the two approaches appear the same, we should follow the Zen of Python to decide when to use which. The class approach might be better if there’s a considerable amount of logic to encapsulate. The function approach might be better for situations where we’re dealing with a simple action.

CustomOpen is first instantiated and then its _enter_ method is called and whatever _enter_ returns is assigned to f in the as f part of the statement. When the contents of the with block is finished executing, the _exit_ method is then called.

# class实现上下文管理
class CustomOpen(object):
def __init__(self, filename):
self.file = open(filename) def __enter__(self):
return self.file def __exit__(self, ctx_type, ctx_value, ctx_traceback):
self.file.close() with CustomOpen('file') as f:
contents = f.read()

The custom_open function executes until it reaches the yield statement. It then gives control back to the with statement, which assigns whatever was yield‘ed to f in the as f portion. The finally clause ensures that close() is called whether or not there was an exception inside the with

# generator实现上下文管理
from contextlib import contextmanager @contextmanager
def custom_open(filename):
f = open(filename)
try:
yield f
finally:
f.close() with custom_open('file') as f:
contents = f.read()

8. 动态类型(Dynamic typing)

  1. Python是动态类型语言,也即是variables没有fixed type,只是引用;
  2. The dynamic typing of Python is often considered to be a weakness, and indeed it can lead to complexities and hardto-debug code. 例如变量a可以是任何object.

1. Avoid using the same variable name for different things.

# Bad
a = 1
a = 'a string'
def a():
pass # Do something
# Good
count = 1
msg = 'a string'
def func():
pass # Do something

2. it may be a good discipline to avoid assigning to a variable more than once

#Bad
items = 'a b c d' # This is a string
items = items.split(' ') # ..becoming a list
items = set(items) # ... and then a set

9. 可变类型和不可变类型(Mutable and immutable types)

9.1 像list这些可变对象,list.append()和list.pop()是原地修改list

9.2 像6这个integer,是不可变对象, x = x + 1会是x指向另一个对象。

my_list = [1, 2, 3]
my_list[0] = 4
print(my_list) # [4, 2, 3] <- The same list has changed x = 6
x = x + 1 # The new x is another object

9.3 string在Python中是不变的

#Bad
# create a concatenated string from 0 to 19 (e.g. "012..1819")
nums = ""
for n in range(20):
nums += str(n) # slow and inefficient
print(nums)
#Good
# create a concatenated string from 0 to 19 (e.g. "012..1819")
nums = []
for n in range(20):
nums.append(str(n))
print("".join(nums)) # much more efficient
# Better
# create a concatenated string from 0 to 19 (e.g. "012..1819")
# list comprehension
nums = [str(n) for n in range(20)]
print("".join(nums))
# Best
# create a concatenated string from 0 to 19 (e.g. "012..1819")
# map
nums = map(str, range(20))
print("".join(nums))

One final thing to mention about strings is that using join() is not always best. In the instances where you are creating a new string from a pre-determined number of strings, using the addition operator is actually faster, but in cases like above or in cases where you are adding to an existing string, using join() should be your preferred method.

foo = 'foo'
bar = 'bar'
foobar = foo + bar # This is good
foo += 'ooo' # This is bad, instead you should do:
foo = ''.join([foo, 'ooo'])
foo = 'foo'
bar = 'bar'
foobar = '%s%s' % (foo, bar) # It is OK
foobar = '{0}{1}'.format(foo, bar) # It is better
foobar = '{foo}{bar}'.format(foo=foo, bar=bar) # It is best

10. General concepts

不要炫技, Explicit code. While any kind of black magic is possible with Python, the most explicit and straightforward manner is preferred.

Avoid the magical wand. it is always better to use the most straightforward way to achieve your goal.

Like a kung fu master, a Pythonista knows how to kill with a single finger, and never to actually do it.

#Bad
def make_complex(*args):
x, y = args
return dict(**locals()) #Good
def make_complex(x, y):
return {'x':x, 'y':y}

第二个Good的写法,可读性强

it is bad practice to have two disjointed statements on the same line of code.

#Bad
print('one'); print('two')
if x == 1: print('one')
if <complex comparison> and < other complex comparison>:
# Do Something #Good
print('one')
print('two') if x == 1:
print('one') cond1 = <complex comparison>
cond2 = <other complex comparision>
if cond1 and cond2:
# Do Something

Function arguments(函数参数)

关于Positional arguments(位置参数).

Positional arguments are mandatory and have no default values.

def send(message, recipient):
pass def point(x, y):
pass # Bad, 虽然可以这样做
send(recipient='World', message='Hello')
point(y=2, x=1) # Good, straightforward并且可读性高
send('Hello', 'World') and point(1, 2)

关于Keyword arguments(关键字参数)

Keyword arguments are not mandatory and have default values. for optional parameters sent to the function.

def send(message, to, cc=None, bcc=None)

arbitrary argument list

In the function body, args will be a tuple of all the remaining positional arguments.

def send(message, *args):
pass # send('a', 'b', 'c' ,'d'), args就等于('b', 'c', 'd')

arbitrary keyword argument dictionary

kwargs will be a dictionary of all the passed named arguments that have not been caught by

other keyword arguments in the function signature.

We are all responsible users.

Python里没有真正的private属性, 所以开发者和用户有责任去遵守约定(conventions).

Rather, instead of relying on concrete walls erected by the developers between their code and other’s, the Python community prefers to rely on a set of conventions indicating that these elements should not be accessed directly.

返回值Returning values

保持单一return就好

def complex_function(a, b, c):
if not a:
return None # Raising an exception might be better
if not b:
return None # Raising an exception might be better
if not c:
return None # Raising an exception might be better # Plan A: Compute X from a, b and c
x = a + b + c
if not x:
# Plan B for computing x
return x # One single exit point for the returned value x will help when maintaining the code.

11. Idioms(习惯用法)

A programming idiom, put simply, is a way to write code.

读书笔记 - The Hitchhiker's Guide to Python的更多相关文章

  1. The Hitchhiker’s Guide to Python! — The Hitchhiker's Guide to Python

    The Hitchhiker's Guide to Python! - The Hitchhiker's Guide to Python The Hitchhiker's Guide to Pytho ...

  2. 读书笔记:编程小白的第一本python入门书

    书名:编程小白的第一本python入门书 作者:侯爵 出版社/出处:图灵社区 年份:2016年 封面: 感想: 本书短小精悍,精华部分在于给编程小白打了鸡血的同时输出了一种“高效学习法的思想”. 个人 ...

  3. <读书笔记>001-以解决问题为导向的python编程实践

    以解决问题为导向的python编程实践 0.第0章:计算机科学 思考:计算机科学是否为计算机编程的简称? 编程的困难点:1.同时做2件事(编程语言的语法.语义+利用其解决问题)  2.什么是好程序(解 ...

  4. Web Scraping with Python读书笔记及思考

    Web Scraping with Python读书笔记 标签(空格分隔): web scraping ,python 做数据抓取一定一定要明确:抓取\解析数据不是目的,目的是对数据的利用 一般的数据 ...

  5. 读书笔记汇总 --- 用Python写网络爬虫

    本系列记录并分享:学习利用Python写网络爬虫的过程. 书目信息 Link 书名: 用Python写网络爬虫 作者: [澳]理查德 劳森(Richard Lawson) 原版名称: web scra ...

  6. 【读书笔记与思考】《python数据分析与挖掘实战》-张良均

    [读书笔记与思考]<python数据分析与挖掘实战>-张良均 最近看一些机器学习相关书籍,主要是为了拓宽视野.在阅读这本书前最吸引我的地方是实战篇,我通读全书后给我印象最深的还是实战篇.基 ...

  7. 《Python神经网络编程》的读书笔记

    文章提纲 全书总评 读书笔记 C01.神经网络如何工作? C02.使用Python进行DIY C03.开拓思维 附录A.微积分简介 附录B.树莓派 全书总评 书本印刷质量:4星.纸张是米黄色,可以保护 ...

  8. 转载-《Python学习手册》读书笔记

    转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html

  9. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

随机推荐

  1. (转)JSONObject的toBean 和 fromObject

    public static void main(String[] args) { Map map=new HashMap();map.put("我","妹"); ...

  2. 概率dp poj 3071

    题目首先给出一个n,表示比赛一共进行n轮,那么队伍就有2^n只队伍输入一个2^n*2^n的矩阵,p[i][j]代表队伍i打败队伍j的概率dp[i][j]代表第i轮比赛的时候,队伍j赢的概率首先初始化时 ...

  3. 前端知识之css

    css的几种引入方式 行内样式 行内式是在标记的style属性中设定css样式,不推荐大规模使用 <p style='color:red'>hello world</p> 内部 ...

  4. 09day vi命令详解

    vi有三种模式(互相切换) 1. 命令模式 2. 插入模式(编辑模式) 3. 低行模式 三种模式的切换方法: 使用技巧 vi 文件信息 i --- 进入编辑模式 esc --- 退出编辑模式 :wq ...

  5. CPI和PPI,谁代表了通膨?

    CPI.PPI 一则旧闻,根据 2016年1月9日 统计局公布的数据,CPI同比增长1.6%,PPI同比下降5.9%. Consumer Price Index 缩写CPI,居民消费价格指数. 统计范 ...

  6. 存储引擎:engine

    1.表类型: 默认的服务器表类型,通过my.ini文件可以手动修改配置:default-storage- engine=INNODB 在创建表,或者编辑表时,可以指定表的存储引擎: 语法:engine ...

  7. pwnable.kr-bof-Writeup

    MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  8. JS高级---工厂模式创建对象和自定义构造函数创建对象的区别

    创建对象:工厂模式和自定义构造函数的区别 共同点: 都是函数, 都可以创建对象, 都可以传入参数   区别:   工厂模式: 函数名是小写 有new, 有返回值 new之后的对象是当前的对象 直接调用 ...

  9. Servlt入门

    Servlt入门 java的两种体系结构 C/S (客户端/服务器)体系结构  通讯效率高且安全,但系统占用多 B/S (浏览器/服务器)体系结构    节约开发成本 C/S (客户端/服务器)体系结 ...

  10. ACL与OSPF综合实验

    OSPF与ACL 综合实验   拓扑图如下: 分析: 配置基本配置: R1: R2: R3: 2.配置OSPF: R1: R2: R3: IT: 设置IT的ip 并划分到ospf2区域 3.配置ACL ...