1. 程式人生 > >python基礎知識踩點

python基礎知識踩點

1、註釋

在python中,註釋是以任何存在於#右側的文字,其主要作用是寫給程式讀者看的筆記。


例如
單行註釋
>>print("hello world") #這是一個註釋

多行註釋使用一對'''
'''
這是註釋
這是註釋
這是註釋
'''

2、Python2的中文編碼問題

python2中預設的編碼不支援中文,如果要在python2中支援中文,需要在.py檔案的開頭宣告使用的編碼。


在py檔案的開頭新增下面語句:
#coding=utf-8
也可以有另外一種宣告格式:
#-*- coding:utf-8 -*-

3、python2和python3中輸入功能不同

python2和python3中獲取輸入的方法不同,需要注意所有從鍵盤獲取的輸入都是字串型別。


在python2中,獲取輸入的方法是:
>>>a = raw_input("請輸入內容:")

在python3中,獲取輸入的方法是:
>>>a = input("請輸入內容:")

4、變數型別轉換

5、"is"和"=="的區別

6、真除法和地板除

在python中實際上有3種類型的除法,有2種不同的除法操作符,其中一種在python3中有了變化:
x / y
傳統除法和真除法。在python2.6或之前的版本中,這個操作對於整數會省去小數部分,對於浮點數會保持小數部分。在python3.0版本中將會變成真除法(無論任何型別都會儲存小數部分)
x // y


floor除法(地板除)。在python2.6中新增的操作,在python2.6和python3.0中均能使用。這個操作不考慮操作物件的型別,總會省略結果的小數部分,剩下最小的能整除的整數部分。


[email protected]:~$ ipython3
Python 3.5.2 (default, Jul  5 2016, 12:43:10) 
In [1]: 10 / 4
Out[1]: 2.5

In [2]: 10 //4
Out[2]: 2

In [3]: 10 /4.0
Out[3]: 2.5

In [4]: 10 //4.0
Out[4]: 2.0

[email protected]:~$ ipython
Python 2.7.12 (default, Jul  1 2016, 15:12:24)
In [1]: 10 / 4
Out[1]: 2

In [2]: 10 / 4.0
Out[2]: 2.5

In [4]: 10 // 4
Out[4]: 2

In [5]: 10 // 4.0
Out[5]: 2.0

7、迭代器

可迭代物件:如果物件是實際儲存的序列,或者可以在可迭代工具環境中一次產生一個結果的物件,就可以看做是可迭代的,也就是迭代器。
可迭代協議:有__next__方法的物件會前進到下一個結果,而在一系列結果的末尾,則會引發StopIteration。在python中,任何這類物件都認為是可迭代的。任何這類物件能以for迴圈或者其他迭代工具遍歷,因為所有迭代工具內部工作起來就是每次迭代中呼叫__next__,並且捕捉StopIteration異常來確定何時離開。


字串迭代器
In [1]: for i in "abc":
   ...:     print(i)
   ...:     
a
b
c
檔案迭代器:
In [1]: f = open('script1.py')

In [2]: f.__next__()
Out[2]: 'import sys\n'

In [3]: f.__next__()
Out[3]: 'print(sys.path)\n'

In [4]: f.__next__()
Out[4]: 'x = 2\n'

In [5]: f.__next__()
Out[5]: 'print(2**10)\n'

In [6]: f.__next__()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-6-39ec527346a9> in <module>()
----> 1 f.__next__()

StopIteration:

手動迭代:iter和next
為了支援手動迭代程式碼,python3提供了一個內建函式next,它會自動呼叫一個物件的__next__方法。給定一個可迭代物件x,調到next(x)等同於x.__next__(),但前者簡單得多。


例如,對於檔案的任何一種形式都可以使用
In [7]: f = open('script1.py')

In [8]: f.__next__()
Out[8]: 'import sys\n'

In [9]: f.__next__()
Out[9]: 'print(sys.path)\n'

In [10]: f = open('script1.py')

In [11]: next(f)
Out[11]: 'import sys\n'

In [12]: next(f)
Out[12]: 'print(sys.path)\n'

生成器都是 Iterator 物件,但 list 、 dict 、 str 雖然是 Iterable ,卻不是 Iterator 。

把 list 、 dict 、 str 等 Iterable 變成 Iterator 可以使用 iter() 函式:


In [26]: L = [11,22,33]

In [27]: I = iter(L)

In [28]: next(I)
Out[28]: 11

In [29]: next(I)
Out[29]: 22

In [30]: next(I)
Out[30]: 33

判斷一個數據型別是否是可迭代器物件。
可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator。
可以使用 isinstance() 判斷一個物件是否是 Iterator 物件:


In [39]: from collections import Iterator

In [40]: isinstance((x for x in range(10)),Iterator)
Out[40]: True

In [41]: isinstance([],Iterator)
Out[41]: False

In [42]: isinstance({},Iterator)
Out[42]: False

In [43]: isinstance("abc",Iterator)
Out[43]: False

In [44]: isinstance(100,Iterator)
Out[44]: False

In [45]: f = open('script1.py')

In [46]: isinstance(f,Iterator)
Out[46]: True

總結:
凡是可作用於 for 迴圈的物件都是 Iterable 型別;
凡是可作用於 next() 函式的物件都是 Iterator 型別
集合資料型別如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不過可以通過 iter() 函式獲得一個 Iterator 物件。

8、動態新增屬性和方法

動態程式語言 是 高階程式設計語言 的一個類別,在電腦科學領域已被廣泛應用。它是一類 在執行時可以改變其結構的語言 :例如新的函式、物件、甚至程式碼可以被引進,已有的函式可以被刪除或是其他結構上的變化。動態語言目前非常具有活力。例如JavaScript便是一個動態語言,除此之外如 PHP 、 Ruby 、 Python 等也都屬於動態語言,而 C 、 C++ 等語言則不屬於動態語言。----來自 維基百科
在python中,可以在程式執行過程中新增屬性和方法:


新增屬性:
>>> class Person(object):
    def __init__(self, name = None, age = None):
        self.name = name
        self.age = age
>>> P = Person("小明", "24")
#在這裡,我們定義了1個類Person,在這個類裡,定義了兩個初始屬性name和age。
#如果我們想新增一個性別的屬性可以這樣做:
>>> P.sex = "male"
>>> P.sex
'male'
>>>

#如果要新增的屬性對於類的所有物件都適用,那麼可以將這個屬性繫結在類上
>>>> Person.sex = None #給類Person新增一個屬性
>>> P1 = Person("小麗", "25")#建立一個新物件
>>> print(P1.sex) #如果P1這個例項物件中沒有sex屬性的話,那麼就會訪問它的類屬性
None #可以看到沒有出現異常
>>>

動態新增方法


 >>> class Person(object):
    def __init__(self, name = None, age = None):
        self.name = name
        self.age = age
    def eat(self):
        print("eat food")


>>> def run(self, speed):
    print("%s在移動, 速度是 %d km/h"%(self.name, speed))


>>> P = Person("老王", 24)
>>> P.eat()
eat food
>>> 
>>> P.run()
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    P.run()
AttributeError: Person instance has no attribute 'run'
>>>
>>>
>>> import types
>>> P.run = types.MethodType(run, P)
>>> P.run(180)
老王在移動,速度是 180 km/h

既然給類新增方法,是使用"類名.方法名 = xxxx",那麼給物件新增一個方法也是類似的"物件.方法名 = xxxx"
完整程式碼如下:


import types

#定義了一個類
class Person(object):
    num = 0
    def __init__(self, name = None, age = None):
        self.name = name
        self.age = age
    def eat(self):
        print("eat food")

#定義一個例項方法
def run(self, speed):
    print("%s在移動, 速度是 %d km/h"%(self.name, speed))

#定義一個類方法
@classmethod
def testClass(cls):
    cls.num = 100

#定義一個靜態方法
@staticmethod
def testStatic():
    print("---static method----")

#建立一個例項物件
P = Person("老王", 24)
#呼叫在class中的方法
P.eat()

#給這個物件新增例項方法
P.run = types.MethodType(run, P)
#呼叫例項方法
P.run(180)

#給Person類繫結類方法
Person.testClass = testClass
#呼叫類方法
print(Person.num)
Person.testClass()
print(Person.num)

#給Person類繫結靜態方法
Person.testStatic = testStatic
#呼叫靜態方法
Person.testStatic()

9、__slots__的作用

動態語言與靜態語言的不同:
動態語言:可以在執行的過程中,修改程式碼。
靜態語言:編譯時已經確定好程式碼,執行過程中不能修改。
如果我們想要限制例項的屬性怎麼辦?比如,只允許對Person例項新增name和age屬性。
為了達到限制的目的,Python允許在定義class的時候,定義一個特殊的__slots__變數,來限制該class例項能新增的屬性:


>>> class Person(object):
    __slots__ = ("name", "age")

>>> P = Person()
>>> P.name = "老王"
>>> P.age = 20
>>> P.score = 100
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
AttributeError: Person instance has no attribute 'score'
>>>

注意:
使用__slots__要注意,__slots__定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的


In [67]: class Test(Person):
    ...:     pass
    ...:

In [68]: t = Test()
In [69]: t.score = 100

來源:https://segmentfault.com/a/1190000017439131