Python的語言特性
Python是一門具有強類型(即變量類型是強制要求的)、動態性、隱式類型(不需要做變量聲明)、大小寫敏感(var和VAR代表了不同的變量)以及面向對象(一切皆為對象)等特點的編程語言。
獲取幫助
你可以很容易的通過Python解釋器獲取幫助。如果你想知道一個對象(object)是如何工作的,那么你所需要做的就是調用help(<object>)!另外還有一些有用的方法,dir()會顯示該對象的所有方法,還有
<object>.__doc__會顯示其文檔: Python >>> help(5) Help on int object: (etc etc) >>> dir(5) ['__abs__', '__add__', ...] >>> abs.__doc__ 'abs(number) -> number Return the absolute value of the argument.'
語法
Python中沒有強制的語句終止字符,且代碼塊是通過縮進來指示的??s進表示一個代碼塊的開始,逆縮進則表示一個代碼塊的結束。聲明以冒號(:)字符結束,并且開啟一個縮進級別。單行注釋以井號字符(#)開頭,多行注釋則以多行字符串的形式出現。賦值(事實上是將對象綁定到名字)通過等號(“=”)實現,雙等號(“==”)用于相等判斷,”+=”和”-=”用于增加/減少運算(由符號右邊的值確定增加/減少的值)。這適用于許多數據類型,包括字符串。你也可以在一行上使用多個變量。例如:
Python
>>> myvar = 3 >>> myvar += 2 >>> myvar 5 >>> myvar -= 1 >>> myvar 4 """This is a multiline comment. The following lines concatenate the two strings.""" >>> mystring = "Hello" >>> mystring += " world." >>> print mystring Hello world. # This swaps the variables in one line(!). # It doesn't violate strong typing because values aren't # actually being assigned, but new objects are bound to # the old names. >>> myvar, mystring = mystring, myvar
數據類型
Python
>>> sample = [1, ["another", "list"], ("a", "tuple")] >>> mylist = ["List item 1", 2, 3.14] >>> mylist[0] = "List item 1 again" # We're changing the item. >>> mylist[-1] = 3.21 # Here, we refer to the last item. >>> mydict = {"Key 1": "Value 1", 2: 3, "pi": 3.14} >>> mydict["pi"] = 3.15 # This is how you change dictionary values. >>> mytuple = (1, 2, 3) >>> myfunction = len >>> print myfunction(mylist) 3
你可以使用:運算符訪問數組中的某一段,如果:左邊為空則表示從個元素開始,同理:右邊為空則表示到一個元素結束。負數索引則表示從后向前數的位置(-1是一個項目),例如:
Python
>>> mylist = ["List item 1", 2, 3.14] >>> print mylist[:] ['List item 1', 2, 3.1400000000000001] >>> print mylist[0:2] ['List item 1', 2] >>> print mylist[-3:-1] ['List item 1', 2] >>> print mylist[1:] [2, 3.14] # Adding a third parameter, "step" will have Python step in # N item increments, rather than 1. # E.g., this will return the first item, then go to the third and # return that (so, items 0 and 2 in 0-indexing). >>> print mylist[::2] ['List item 1', 3.14]
字符串
Python中的字符串使用單引號(‘)或是雙引號(“)來進行標示,并且你還能夠在通過某一種標示的字符串中使用另外一種標示符(例如 “He said ‘hello’.”)。而多行字符串可以通過三個連續的單引號(”’)或是雙引號(“””)來進行標示。Python可以通過u”This is a unicode string”這樣的語法使用Unicode字符串。如果想通過變量來填充字符串,那么可以使用取模運算符(%)和一個元組。使用方式是在目標字符串中從左至右使用%s來指代變量的位置,或者使用字典來代替,示例如下:Python
>>>print "Name: %s Number: %s String: %s" % (myclass.name, 3, 3 * "-") Name: Poromenos Number: 3 String: --- strString = """This is a multiline string.""" # WARNING: Watch out for the trailing s in "%(key)s". >>> print "This %(verb)s a %(noun)s." % {"noun": "test", "verb": "is"} This is a test.
流程控制
這些聲明的語法示例:
Python
rangelist = range(10) >>> print rangelist [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] for number in rangelist: # Check if number is one of # the numbers in the tuple. if number in (3, 4, 7, 9): # "Break" terminates a for without # executing the "else" clause. break else: # "Continue" starts the next iteration # of the loop. It's rather useless here, # as it's the last statement of the loop. continue else: # The "else" clause is optional and is # executed only if the loop didn't "break". pass # Do nothing if rangelist[1] == 2: print "The second item (lists are 0-based) is 2" elif rangelist[1] == 3: print "The second item (lists are 0-based) is 3" else: print "Dunno" while rangelist[1] == 1: pass
函數
函數通過“def”關鍵字進行聲明??蛇x參數以集合的方式出現在函數聲明中并緊跟著必選參數,可選參數可以在函數聲明中被賦予一個默認值。已命名的參數需要賦值。函數可以返回一個元組(使用元組拆包可以有效返回多個值)。Lambda函數是由一個單獨的語句組成的特殊函數,參數通過引用進行傳遞,但對于不可變類型(例如元組,整數,字符串等)則不能夠被改變。這是因為只傳遞了該變量的內存地址,并且只有丟棄了舊的對象后,變量才能綁定一個對象,所以不可變類型是被替換而不是改變(譯者注:雖然Python傳遞的參數形式本質上是引用傳遞,但是會產生值傳遞的效果)。例如:
Python
# 作用等同于 def funcvar(x): return x + 1 funcvar = lambda x: x + 1 >>> print funcvar(1) 2 # an_int 和 a_string 是可選參數,它們有默認值 # 如果調用 passing_example 時只指定一個參數,那么 an_int 缺省為 2 ,a_string 缺省為 A default string。如果調用 passing_example 時指定了前面兩個參數,a_string 仍缺省為 A default string。 # a_list 是必備參數,因為它沒有指定缺省值。 def passing_example(a_list, an_int=2, a_string="A default string"): a_list.append("A new item") an_int = 4 return a_list, an_int, a_string >>> my_list = [1, 2, 3] >>> my_int = 10 >>> print passing_example(my_list, my_int) ([1, 2, 3, 'A new item'], 4, "A default string") >>> my_list [1, 2, 3, 'A new item'] >>> my_int 10
類
Python
class MyClass(object): common = 10 def __init__(self): self.myvariable = 3 def myfunction(self, arg1, arg2): return self.myvariable # This is the class instantiation >>> classinstance = MyClass() >>> classinstance.myfunction(1, 2) 3 # This variable is shared by all classes. >>> classinstance2 = MyClass() >>> classinstance.common 10 >>> classinstance2.common 10 # Note how we use the class name # instead of the instance. >>> MyClass.common = 30 >>> classinstance.common 30 >>> classinstance2.common 30 # This will not update the variable on the class, # instead it will bind a new object to the old # variable name. >>> classinstance.common = 10 >>> classinstance.common 10 >>> classinstance2.common 30 >>> MyClass.common = 50 # This has not changed, because "common" is # now an instance variable. >>> classinstance.common 10 >>> classinstance2.common 50 # This class inherits from MyClass. The example # class above inherits from "object", which makes # it what's called a "new-style class". # Multiple inheritance is declared as: # class OtherClass(MyClass1, MyClass2, MyClassN) class OtherClass(MyClass): # The "self" argument is passed automatically # and refers to the class instance, so you can set # instance variables as above, but from inside the class. def __init__(self, arg1): self.myvariable = 3 print arg1 >>> classinstance = OtherClass("hello") hello >>> classinstance.myfunction(1, 2) 3 # This class doesn't have a .test member, but # we can add one to the instance anyway. Note # that this will only be a member of classinstance. >>> classinstance.test = 10 >>> classinstance.test 10
異常
Python
def some_function(): try: # Division by zero raises an exception 10 / 0 except ZeroDivisionError: print "Oops, invalid." else: # Exception didn't occur, we're good. pass finally: # This is executed after the code block is run # and all exceptions have been handled, even # if a new exception is raised while handling. print "We're done with that." >>> some_function() Oops, invalid. We're done with that.
導入
Python
import random from time import clock randomint = random.randint(1, 100) >>> print randomint 64 文件I / O Python針對文件的處理有很多內建的函數庫可以調用。例如,這里演示了如何序列化文件(使用pickle庫將數據結構轉換為字符串): Python import pickle mylist = ["This", "is", 4, 13327] # Open the file C:binary.dat for writing. The letter r before the # filename string is used to prevent backslash escaping. myfile = open(r"C:binary.dat", "w") pickle.dump(mylist, myfile) myfile.close() myfile = open(r"C:text.txt", "w") myfile.write("This is a sample string") myfile.close() myfile = open(r"C:text.txt") >>> print myfile.read() 'This is a sample string' myfile.close() # Open the file for reading. myfile = open(r"C:binary.dat") loadedlist = pickle.load(myfile) myfile.close() >>> print loadedlist ['This', 'is', 4, 13327]
其它雜項
數值判斷可以鏈接使用,例如 1<a<3 能夠判斷變量 a 是否在1和3之間。
可以使用 del 刪除變量或刪除數組中的元素。
Python
>>> lst1 = [1, 2, 3] >>> lst2 = [3, 4, 5] >>> print [x * y for x in lst1 for y in lst2] [3, 4, 5, 6, 8, 10, 9, 12, 15] >>> print [x for x in lst1 if 4 > x > 1] [2, 3] # Check if an item has a specific property. # "any" returns true if any item in the list is true. >>> any([i % 3 for i in [3, 3, 4, 4, 3]]) True # This is because 4 % 3 = 1, and 1 is true, so any() # returns True. # Check how many items have this property. >>> sum(1 for i in [3, 3, 4, 4, 3] if i == 4) 2 >>> del lst1[0] >>> print lst1 [2, 3] >>> del lst1
全局變量在函數之外聲明,并且可以不需要任何特殊的聲明即能讀取,但如果你想要修改全局變量的值,就必須在函數開始之處用global關鍵字進行聲明,否則Python會將此變量按照新的局部變量處理(請注意,如果不注意很容易被坑)。例如:
Python
number = 5 def myfunc(): # This will print 5. print number def anotherfunc(): # This raises an exception because the variable has not # been bound before printing. Python knows that it an # object will be bound to it later and creates a new, local # object instead of accessing the global one. print number number = 3 def yetanotherfunc(): global number # This will correctly change the global. number = 3
小結