Python 号称“最优雅的语言”,近年来的热度超过了“世界上最好的语言” PHP,于是简单学习了一下。发现 Python 有的语法确实很爽,比如切片。但同时觉得,有些语法对于之前主要使用 PHP 和 JavaScript 的新手来说,可能会稍感水土不服。简要列举一些比较特别的示例,分享给大家。
奇怪的语法
-
用
r''
表示''
内部的字符串不转义print(r'I\'m \"OK\"!') print('I\'m \"OK\"!')
-
用
'''内容'''
表示多行内容print('''line1 line2 line3''')
-
要注意的运算符
python 中不存在 &&、||、=== 运算符,用以下运算符代替:
and or is
python 中用
//
表示相除‘舍一取整’14 // 3 14 / 3
python 中用 ** 表示幂赋值运算
2 ** 3
-
内容含有中文,需要最开始一行声明 UTF-8 读取
# -*- coding: utf-8 -*-
-
字符串格式化输出
'Hi, %s, you have $%d.' % ('Lucy', 100) '[%5d - %05d]' % (3, 1) '%.2f' % 3.1415926 'growth rate: %d %%' % 7
-
规定定义只有一个元素的元组时,要加
,
消除歧义t1 = (1,) t2 = (1)
-
数据类型检查
isinstance('3.14', (int, float))
-
默认参数不能是可变对象(list、dict)
def add_end(L=[]): L.append('END') return L add_end() add_end()
-
可变参数(args 接收的是一个 tuple)
def calc(*args): sum = 0 for n in args: sum = sum + n * n return sum calc(1, 2) calc(1, 2, 3, 4, 5)
-
关键字参数(kw 接收的是一个 dict)
def person(name, **kw): print('name:', name, 'other:', kw) person('Lucy') person('Lucy', age=23, weight='70kg')
-
切片
# -*- coding: utf-8 -*- L = [i for i in range(100)] # 索引从 0 开始, 到 10 结束, 步长为 1 print(L[:10]) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 从索引 10 开始, 步长为 1 print(L[10:]) // [10 ,11, 12, 13, ... , 99] # 最后 10 个元素, 步长为 1 print(L[-10:]) // [90, 91, 92, 93, 94, 95, 96, 97, 98, 99] # 从索引 2 开始, 步长为 3 print(L[2::3]) // [2, 5, 8, 11, ... , 98] # 索引从 4 开始, 到 50 结束, 步长为 5 print(L[4:50:5]) // [4, 9, 14, 19, 24, 29, 34, 39, 44, 49] # 索引从 4 开始, 步长为 10 print(L[4::10]) // [4, 14, 24, 34, 44, 54, 64, 74, 84, 94] # 索引从 4 开始, 步长为 10, 取前 3 个元素 print(L[4::10][:3]) // [4, 14, 24] # 索引从 4 开始, 步长为 10, 从第 3 个元素往后取 print(L[4::10][3:]) // [34, 44, 54, 64, 74, 84, 94] # 索引从 4 开始, 步长为 10, 取最后 3 个元素 print(L[4::10][-3:]) // [74, 84, 94] # 索引从 4 开始, 步长为 10, 截掉最后 3 个元素 print(L[4::10][:-3]) // [4, 14, 24, 34, 44, 54, 64] # 列表倒序 print(L[::-1]) # 列表倒序, 从倒数索引 3 开始, 取到末尾 print(L[3::-1]) // [3, 2, 1, 0] # 首字母大写 def firstCharUpper(s): return s[:1].upper() + s[1:] print(firstCharUpper('hello')) print(firstCharUpper('sunday')) print(firstCharUpper('september'))
-
生成列表
[x * x for x in range(1, 11) if x % 2 == 0]
-
斐波拉契数列(Fibonacci)
def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return 'done'
-
装饰器
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
-
匿名函数
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
-
偏函数
import functools int2 = functools.partial(int, base=2) int2('1000000') int2('1010101')
-
遍历取得索引(需要额外使用 enumerate 函数)
L = ['Adam', 'Lisa', 'Bart', 'Paul'] for index, name in enumerate(L): print(index, '-', name)
-
列表生成式 -- 实现找出对称的三位数,例如 121
L1 = [x for x in range(100, 1000) if str(x)[0] == str(x)[-1]] L2 = [(100 * m) + (10 * n) + m for m in range(1, 10) for n in range (0, 10)]
-
装饰器 【优雅】
def log(f): def fn(*args, **kw): print('call ' + f.__name__ + '()...') return f(*args, **kw) return fn @log def add(x, y): return x + y print(add(1, 2))
-
斐波那契数列(0, 1, 1, 2, 3, 5, 8 ...)
class Fib(object): def __init__(self, num): a, b, L = 0, 1, [] for n in range(num): L.append(a) a, b = b, a + b self.numbers = L def __str__(self): return str(self.numbers) __repr__ = __str__ def __len__(self): return len(self.numbers) f = Fib(10) print(f) print(len(f))
Tips: 大家感觉以上语法/实现,哪些优雅?哪些古怪?