X

曜彤.手记

随记,关于互联网技术、产品与创业

  1. 其他:
    1. 1、xrange 和 range:
    2. 2、super().__init__():
    3. 3、read / readline / readlines:
    4. 4、is:
    5. 5、GC:

Python 小记

最近在工作中一直在从事 Python 相关的工作,因为以前 Python 用的比较少,特地趁此机会好好学习和复习一下,将一些基础性的知识点整理在这里。同时也方便以后的回顾和查找。关于 Python 的编码规范,有两种常用规范可以选择。一个是 PEP8,另一个是 Google Python 规范。

# 控制台输入;
s = input("Please input:")

# 类型转换(Python 不允许类型的隐式转换);
s = int(s)
s = str(s)

# 可迭代对象;
from collections import Iterable
isinstance([], Iterable) # True

# Python 的 for 循环本质上是通过不断调用 next() 函数实现的;
for x in [1, 2, 3, 4, 5]:
    pass

# 首先获得 Iterator 对象;
it = iter([1, 2, 3, 4, 5])
# 循环;
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到 StopIteration 就退出循环;
        break


# 多行模式,续行模式;
print('''line1
line2 
line2''');

# 编码转换;
ord('A') # 65
chr(66) # 'B'

# 字符串模版;
'Hi, %s, you have $%d.' % ('Michael', 1000000);
# 'Hi, Michael, you have $1000000.'

# 判断某一个键值对是否在一个 dict 中;
'Name' in {'Name': 'Jason', 'Age': 18}

# Set 相关;
s = set([1, 1, 3, 4])
s.add(4)
s.remove(1)

# 交集;
s & set([1, 3])

# 偏函数;
import functools
def log(level, message, stack):
    print(level + ": " + message)
    print(stack)
    
log_unknown_error = functools.partial(functools.partial(log, "Error"), "Unknown")

# 使用不变类型做默认参数;
def add_end(L = None):
    if L is None:
        L = []
    L.append('END')
    return L

# 可变参数和关键字参数;
def f1(a, b, c = 0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

args = (1, 2, 3, 4);
kw = {'d': 99, 'x': '#'}
f1(args, kw);
# a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}

# 列表生成式;
[x * x for x in range(1, 11) if x % 2 == 0]

d = {'x': 'A', 'y': 'B', 'z': 'C' }
[k + '=' + v for k, v in d.items()]

L = ['Hello', 'World', 'IBM', 'Apple']
[s.lower() for s in L]

# 切片;
l = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'];
l[:3]
l[-2:]
l[:]
l[::2]
'ABCDEFG'[:3]
'ABCDEFG'[::2]

# 生成器(从列表生成式演化过来);
g = (x * x for x in range(10));
next(g);

for n in g:
    print(n);

# 断言(不成立会抛出 Assertion Error);
assert 1 == 1

# 无参数装饰器;
import functools

def log(func):
    @functools.wraps(func) # 修正函数的 __name__ 属性;
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper
# 带参数装饰器;
import functools

def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

# 匿名函数;
func = lambda:1 + 1     # 无参;
func = lambda x:x + 1   # 有参;

# 字符串格式化:
print('{},{}'.format('Hongten','Welcome to my space!'))
print('Hi,{name},{message}'.format(name = 'Tom',message = 'How old are you?'))

table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
    for name, phone in table.items():
        print('{0:10} ==> {1:10d}'.format(name, phone))

# 字符串格式化,填充与宽度限制(^居中、<左对齐、>右对齐);
'{:>8}'.format('189')
'{:0>8}'.format('189')
'{:a>8}'.format('189')

# 字符串格式化,精度限制;
'{:.2f}'.format(321.33345)

# 字符串格式化,进制限制(d/b/o/x);
'{:d}'.format(17)

# 字符串格式化,千分位分隔符;
'{:,}'.format(1234567890)

闭包和 LEGB 法则:

  • Local:可能是在一个函数或者类方法内部;
  • Enclosed:可能是嵌套函数内,比如说一个函数包裹在另一个函数内部;
  • Global:代表的是执行脚本自身的最高层次;
  • Built-in:Python 为自身保留的特殊名称;

闭包最重要的使用价值在于封存函数执行的上下文环境;闭包在其捕捉的执行环境(def 语句块所在上下文)中,遵循 LEGB 规则逐层查找,直至找到符合要求的变量,或者抛出异常。可以看如下的 Python 闭包和 Javscript 闭包的示例代码。会产生闭包的根本原因是因为语言的灵活性,可以将函数作为参数或者返回值,这样某层函数的作用域环境会在特定情况下被“保存”下来。

# Python Version;
def func1():
    i = 0
    def func2():
        nonlocal i
        print(++i)
    return func2

ref = func1() # 保存最外层函数的环境和引用;
ref() # 1
ref() # 2
ref() # 3
// Javascript;
function func1() {
  var i = 0;
  function func2() {
    console.log(++i);
  }
  return func2;
}
var ref = func1();
ref();
ref();
ref();

其他:

1、xrange 和 range:

在 Python 2.x 中,xrange 的性能要好于 range,因为 range 本质是基于 List 构建的,range(30) 会在内存中生成一个大小为30个元素的 List,而 xrange 是则会生成一个序列对象(迭代器),该对象会在程序运行时再进行求值(懒求值)。而在 Python 3.x 中,xrange 已经被更名为 range。

2、super().__init__():

避免了显式的调用父类构造函数。

class ChildA(Base):
    def __init__(self):
        Base.__init__(self)

class ChildB(Base):
    def __init__(self):
        super().__init__()

3、read / readline / readlines:

# 可能产生内存溢出;
with open('./file.txt') as file:
    print(file.read())

# 性能最优,返回一个包含所有行的 List;
with open('./file.txt') as file:
    for line in file.readlines():
        print(line.strip())

# 一次读取一行;
with open('./file.txt') as file:
    while True:
        line = file.readline()
        if line:
            print(line)
        else:
            break

4、is:

is 是比较两个变量所在的内存地址,== 是对比两个变量的值。

5、GC:

Python 的垃圾回收机制主要包括引用计数、标记清除和分代技术。




评论 | Comments


Loading ...