本文共 7326 字,大约阅读时间需要 24 分钟。
1 2 3 4 5 6 7 | s = '' s += 'a' + 'b' + 'c' n = 1 + 2 + 3 # 6 |
如果 while 循环正常结束(没有break退出)就会执行else。
1 2 3 4 5 6 7 8 9 | num = [ 1 , 2 , 3 , 4 ] mark = 0 while mark < len ( num ) : n = num [ mark ] if n % 2 == 0 : print ( n ) # break mark += 1 else : print ( "done" ) |
1 2 3 4 | a = [ 1 , 2 , 3 ] b = [ 'one' , 'two' , 'three' ] list ( zip ( a , b ) ) # [(1, 'one'), (2, 'two'), (3, 'three')] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | x = [ num for num in range ( 6 ) ] # [0, 1, 2, 3, 4, 5] y = [ num for num in range ( 6 ) if num % 2 == 0 ] # [0, 2, 4] # 多层嵌套 rows = range ( 1 , 4 ) cols = range ( 1 , 3 ) for i in rows : for j in cols : print ( i , j ) # 同 rows = range ( 1 , 4 ) cols = range ( 1 , 3 ) x = [ ( i , j ) for i in rows for j in cols ] |
{ key_exp : value_exp fro expression in iterable }
1 2 3 | #查询每个字母出现的次数。 strs = 'Hello World' s = { k : strs . count ( k ) for k in set ( strs ) } |
{expression for expression in iterable }
本以为元组推导式是列表推导式改成括号,后来发现那个 生成器推导式。
1 2 3 | >>> num = ( x for x in range ( 5 ) ) >>> num . . . : < generator object < genexpr > at 0x7f50926758e0 > |
1 2 3 4 | def do ( a = 0 , b , c ) return ( a , b , c ) do ( a = 1 , b = 3 , c = 2 ) |
函数默认参数值在函数定义时已经计算出来,而不是在程序运行时。
列表字典等可变数据类型不可以作为默认参数值。 1 2 3 | def buygy ( arg , result = [ ] ) : result . append ( arg ) print ( result ) |
changed:
1 2 3 4 5 6 7 8 9 10 | def nobuygy ( arg , result = None ) : if result == None : result = [ ] result . append ( arg ) print ( result ) # or def nobuygy2 ( arg ) : result = [ ] result . append ( arg ) print ( result ) |
1 2 3 4 | def do ( * args ) : print ( args ) do ( 1 , 2 , 3 ) ( 1 , 2 , 3 , 'd' ) |
1 2 3 4 | def do ( * * kwargs ) : print ( kwargs ) do ( a = 1 , b = 2 , c = 'la' ) # {'c': 'la', 'a': 1, 'b': 2} |
1 2 3 | a = lambda x : x * x a ( 4 ) # 16 |
生成器是用来创建Python序列的一个对象。可以用它迭代序列而不需要在内存中创建和存储整个序列。
通常,生成器是为迭代器产生数据的。生成器函数函数和普通函数类似,返回值使用 yield 而不是 return 。
1 2 3 4 5 6 7 8 | def my_range ( first = 0 , last = 10 , step = 1 ) : number = first while number < last : yield number number += step >>> my_range ( ) . . . < generator object my_range at 0x7f02ea0a2bf8 > |
有时需要在不改变源代码的情况下修改已经存在的函数。
装饰器实质上是一个函数,它把函数作为参数输入到另一个函数。举个栗子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 一个装饰器 def document_it ( func ) : def new_function ( * args , * * kwargs ) : print ( "Runing function: " , func . __name__ ) print ( "Positional arguments: " , args ) print ( "Keyword arguments: " , kwargs ) result = func ( * args , * * kwargs ) print ( "Result: " , result ) return result return new_function # 人工赋值 def add_ints ( a , b ) : return a + b cooler_add_ints = document_it ( add_ints ) #人工对装饰器赋值 cooler_add_ints ( 3 , 5 ) # 函数器前加装饰器名字 @ document_it def add_ints ( a , b ) : return a + b |
可以使用多个装饰器,多个装饰由内向外向外顺序执行。
1 2 3 4 5 6 7 8 | a = 1234 def test ( ) : print ( "a = " , a ) # True #### a = 1234 def test ( ) : a = a - 1 #False print ( "a = " , a ) |
可以使用全局变量 global a
。
1 2 3 4 5 | a = 1234 def test ( ) : global a a = a - 1 #True print ( "a = " , a ) |
Python 提供了两个获取命名空间内容的函数
local()
global()
Python 保留用法。
举个栗子: 1 2 3 4 5 6 | def amazing ( ) : '''This is the amazing. Hello world''' print ( "The function named: " , amazing . __name__ ) print ( "The function docstring is: n" , amazing . __doc__ ) |
只有错误发生时才执行的代码。
举个栗子: 1 2 3 4 5 6 | >>> l = [ 1 , 2 , 3 ] >>> index = 5 >>> l [ index ] Traceback ( most recent call last ) : File "" , line 1 , in IndexError : list index out of range |
再试下:
1 2 3 4 5 6 7 8 | >>> l = [ 1 , 2 , 3 ] >>> index = 5 >>> try : . . . l [ index ] . . . except : . . . print ( "Error: need a position between 0 and" , len ( l ) - 1 , ", But got" , index ) . . . Error : need a position between 0 and 2 , But got 5 |
没有自定异常类型使用任何错误。
1 2 3 4 5 6 7 8 9 10 11 12 | short_list = [ 1 , 2 , 3 ] while 1 : value = input ( "Position [q to quit]? " ) if value == 'q' : break try : position = int ( value ) print ( short_list [ position ] ) except IndexError as err : print ( "Bad index: " , position ) except Exception as other : print ( "Something else broke: " , other ) |
异常是一个类。类 Exception
的子类。
1 2 3 4 5 6 7 8 9 10 11 | class UppercaseException ( Exception ) : pass words = [ 'a' , 'b' , 'c' , 'AA' ] for i in words : if i . isupper ( ) : raise UppercaseException ( i ) # error Traceback ( most recent call last ) : File "" , line 3 , in __main__ . UppercaseException : AA |
python文件:
1 2 | import sys print ( sys . argv ) |
与print()用法相同,输出结果像是列表字典时会不同。
举个栗子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Person ( ) : def __init__ ( self , name ) : self . name = name class email ( Person ) : def __init__ ( self , name , email ) : super ( ) . __init__ ( name ) self . email = email a = email ( 'me' , 'me@me.me' ) >>> a . name . . . 'me' >>> a . email . . . 'me@me.me' |
1 2 3 4 5 6 7 8 9 | class Person ( ) : def __init__ ( self , name ) : self . __name = name a = Person ( 'me' ) >>> a . name . . . AttributeError : 'Person' object has no attribute '__name' # 小技巧 a . _Person__name |
实例方法,以self作为第一个参数,当它被调用时,Python会把调用该方法的的对象作为self参数传入。
1 2 3 4 | class A ( ) : count = 2 def __init__ ( self ) : # 这就是一个实例方法 A . count += 1 |
1 2 3 4 5 6 7 | class A ( ) : count = 2 def __init__ ( self ) : A . count += 1 @ classmethod def hello ( h ) : print ( "hello" , h . count ) |
注意,使用h.count
(类特征),而不是self.count
(对象特征)。
1 2 3 4 5 | class A ( ) : @ staticmethod def hello ( ) : print ( "hello, staticmethod" ) >>> A . hello ( ) |
创建即用,优雅不失风格。
一个普通方法:
1 2 3 4 5 6 7 8 9 10 | class word ( ) : def __init__ ( self , text ) : self . text = text def equals ( self , word2 ) : #注意 return self . text . lower ( ) == word2 . text . lower ( ) a1 = word ( 'aa' ) a2 = word ( 'AA' ) a3 = word ( '33' ) a1 . equals ( a2 ) # True |
使用特殊方法:
1 2 3 4 5 6 7 8 9 10 | class word ( ) : def __init__ ( self , text ) : self . text = text def __eq__ ( self , word2 ) : #注意,使用__eq__ return self . text . lower ( ) == word2 . text . lower ( ) a1 = word ( 'aa' ) a2 = word ( 'AA' ) a3 = word ( '33' ) a1 == a2 # True |
其他还有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | *方法名 * *使用 * __eq__ ( self , other ) self == other __ne__ ( self , other ) self != other __lt__ ( self , other ) self other __le__ ( self , other ) self = other __add__ ( self , other ) self + other __sub__ ( self , other ) self - other __mul__ ( self , other ) self * other __floordiv__ ( self , other ) self / / other __truediv__ ( self , other ) self / other __mod__ ( self , other ) self % other __pow__ ( self , other ) self * * other __str__ ( self ) str ( self ) __repr__ ( self ) repr ( self ) __len__ ( self ) len ( self ) |
1 2 3 | '%-10d | %-10f | %10s | %10x' % ( 1 , 1.2 , 'ccc' , 0xf ) # '1 | 1.200000 | ccc | 33' |
1 2 3 4 5 6 7 | '{} {} {}' . format ( 11 , 22 , 33 ) # 11 22 33 '{2:2d} {0:-10d} {1:10d}' . format ( 11 , 22 , 33 ) # :后面是格式标识符 # 33 11 22 '{a} {b} {c}' . format ( a = 11 , b = 22 , c = 33 ) |
转载地址:http://uquni.baihongyu.com/