Python3開發隨記(1)關鍵要素

<碎碎念>
2月換了工做,因爲工做緣由學習了一些Python的基礎,一開始在網上看了廖雪峯老師的Python2.7的教程,本身試着寫了一些代碼,忽然發現越寫越上癮,而後想好好學習一下,因此買了Python3的書,這一系列的隨記就看成學習筆記好了
問題,如何解決windows下python多版本的問題,度娘答案都很麻煩,pythonbrew好像不支持windows。
在Linux下作Python開發的人多很少?純命令行模式仍是GUI模式下作開發?很好奇哈
能夠留言或者郵件給我,相互學習探討。
謝謝你們
Hosea Lee
hosealee0208@gmail.com
</碎碎念>

Python3開發隨記(1)關鍵要素

這一部分都是些簡單的概念,都是一帶而過,你們也沒必要深究,後面會逐步完善內容,進度隨着我看書的速度吧。另外,目前開發使用的是Python2.7,Web開發框架使用的是limodou老師的Uliweb,推薦給你們。其實他也是我如今的領導,哈哈。
python

要素#1:數據類型

Python提供了幾種內置的數據類型,如今咱們先來看其中的兩種。
web

Python使用int類型表示整數(正整數 或 負整數),使用str類型表示字符串(Unicode字符序列)。例如:express

-973
1634561315465315346135154654313541546132132154658908907896896789789789
0
"Infinitely Demanding"
"Hosea Lee"
"α β ∑"
""
''

上面第二行能夠看到一個很大很大的整數,記住,Python所能表示的整數大小隻受限於機器內存,而非固定數量的字節數。我猜Python能用於科學計算的緣由之一就是這樣的吧。編程

因爲Python使用的是Unicode編碼,所以字符串中的符號不侷限與ASCII字符,好比上面倒數第三行的三個特殊符號。windows

Python使用方括號([])來存取字符序列中的某一項,好比,在Python Shell中,有以下的輸入和輸出:數組

>>> "Hello world!"[1]
'e'

方括號存取這種語法適用於任意數據類型的數據項,只要該數據的構成是一個序列。好比字符串或列表,這種語法的一致性是Python很吸引個人緣由之一。app

注意:str類型與基本的數值類型都是固定的,也就是說一旦設定,其值就不能改變。框架

>>> "abcde"[0]=1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

如上,改變字符串"abcde"的第一個字符後控制檯報錯。dom

str類型與int類型以前能夠相互轉換,Python的語法datatype(item)是用來作類型轉換的,例如:編程語言

>>> int("12")
12
>>> str(12)
'12'

int()轉換能夠容許在頭尾處帶有空格,所以,int("  12   ")也是正確的。str()轉換幾乎能夠應用於全部數據項。

錯誤的類型轉換就不舉例了,本身去試試就知道了,只要遵循有意義的轉換原則通常都是成功的。


要素#2:對象引用

上面咱們瞭解了定義數據類型,而後咱們要把定義的數據存儲在某種數據類型的變量中,可是Python沒有這樣的變量,而是使用「對象引用」,以下:

x="blue"
y="green"
z=x

上面三條語句中,語法都是objectReference=value。Python不須要預先的聲明語句和指定值的類型。第一行中,Python會建立一個str對象,str對象的文本內容爲「blue」,同時還建立了一個名爲x的對象引用,x引用的就是str對象。咱們能夠說「變量x已經被分配了‘blue'這個字符串「。

Python使用」動態類型「機制。即某個對象引用均可以從新引用一個不一樣對象(能夠是不一樣的數據類型)。例如:

>>> route = 666
>>> print(route,type(route))
666 <class 'int'>
>>> route = "Nordic"
>>> print(route,type(route))
Nordic <class 'str'>

咱們建立了一個成爲route的對象引用,並將其設置爲引用一個新的int型數值666,使用type()輸出該對象引用的數據類型(也成爲類),咱們能夠看輸出了<class 'int'>,而後咱們將route這個對象引用引用到一個str類型的對象上,type()輸出<class 'str'>,以前的int(666)會被Python進行垃圾回收。


要素#3:組合數據類型

一般,將整個的數據項組合在一塊兒會帶來很多方便。Python提供了幾種組合數據類型,包括關聯數組與集合等類型。

咱們先來看一看其中的兩種:元組Tuple列表List

元組和列表可用於存儲任意數量、任意類型的數據項。

元組tuple是固定的,建立以後就不能改變;

列表list是可變的,能夠對其進行插入、移除等操做。

元組使用逗號建立:

>>> "Denmark","Finland","Norway","Sweden"
('Denmark', 'Finland', 'Norway', 'Sweden')
>>> "one",
('one',)

在輸出元組的時候,Python使用圓括號將其封裝在一塊兒,咱們也能夠模仿這種機制,老是將本身定義的元組常值包在圓括號中。若是元組只有一個數據項,就必須在數據項後添加一個逗號,不然將被翻譯成str類型,例如:

>>> "one"
'one'
>>> "one",
('one',)

如上,

"one"

"one",

是不同的。

空元組使用()就能夠建立。若是須要將元組常值做爲參數傳遞,就必須是用括號對其進行封裝,以避免混淆。

列表可使用方括號([])建立,以下:

[1,2,3,4,5,6]
['alpha','bravo','charlie','delta','echo']
['zebra',444,-10,"Malkin"]
[]

實質上,列表與元組並不真正存儲數據項,而是存放對象引用。

組合數據類型也是對象,所以,咱們也能夠將某種組合數據類型嵌套放在其餘組合數組類型中,例如:

[("a",),[1,2,"3"],"Hosea"]

全部Python數據項都是某種特定數據類型的「對象」(也叫作「實例」)

其餘關於Tuple和List的內容不詳述了,和其餘語言都差很少的。


要素#4:邏輯操做符

No.1 身份操做符

            因爲全部的Python變量實際上都是對象的引用,有時,詢問兩個或更多的對象引用是否都指向相同的對象是有意義的,is操做符是一個二元操做符,若是其左右兩端的對象引用都指向同一個對象,則返回true。

>>> a=["Reservation",3,None]
>>> b=["Reservation",3,None]
>>> a is b
False
>>> b=a
>>> a is b
True

is操做符只須要對比兩端對象引用是否指向內存中同一個地址,同一個地址即同一個對象,因此is操做符不對對象自己進行檢查,這樣速度就會很是快。

最多見的使用is的狀況是檢查某個數據項是不是NoneNone是一個內置的空對象,一般用做位置標記值,表示「未知「或」不存在「:

>>> a="Something"
>>> b=None
>>> a is not None,b is None
(True, True)

No.2 比較操做符

這些操做符對對象的值進行比較,也就是對象引用所指向的對象:

== != > < >= <=

Python比較操做符的一個特別好用的特性是能夠進行結鏈比較:

>>> a=10
>>> 0<=a<=11
True

No3. 成員操做符

對序列或集合這一類的數據類型,好比字符串、列表或元組,可使用操做符in來測試成員關係,用not in來測試非成員關係:

>>> p=(1,2,3,"4","Hosea")
>>> 2 in p
True
>>> "Hosea" not in p
False

對列表與元組,in操做符使用線性搜索,對很是大的組合類型,速度可能很慢,而對字典或者集合,in操做能夠很是快,這些組合數據類型都將在之後再慢慢講,不急不急。。。

No4. 邏輯運算符

邏輯運算符有三個,and、or、not。

>>> five=5
>>> two=2
>>> zero=0
>>> five and two
2
>>> two and five
5
>>> five and zero
0

返回的是決定結果的操做數而不是布爾值,除非實際上就是布爾操做數

>>> t=True
>>> f=False
>>> t and t
True
>>> t and f
False
>>> t or f
True
>>> f or f
False

要素#5:控制流語句

No.1 if語句

Python的常規if


語句語法以下:

if boolean_expression1:

    suite1

elif boolean_expression2:

    suite2

......

elif boolean_expressionN:

    suiteN

else:

    else_suite

注意,這裏沒有圓括號或者方括號,冒號千萬不要忘記,縮進是Python用來標識代碼塊結構的重要途徑,起初我寫這樣代碼很不適應,但沒有幾天就習慣了,並且以爲這種寫法纔是最優美且不易混淆的(我的觀點,勿噴)

下面來一個tiny case:

if lines < 1000:
    print("small")
elif lines<10000:
    print("medium")
else:
    print("large")

No.2 while語句

while語句用於0次或屢次執行某個suite,循環執行的次數取決於while循環中布爾表達式的狀態,語法格式:

while boolean_expression:

        suite

不詳述了,沒啥可講的

No.3 for...in語句

Python下的for循環語句重用了關鍵字 in,在其餘上下文中,in是一個成員操做符,語法格式:

for variable in iterable:

        suite

variable將逐一引用iterable中的每個對象,iterable是能夠迭代的任意數據類型,包括字符串、列表、元組以及Python的其餘組合數據類型。

>>> countries = ["Denmark","Finland","Norway","Sweden"]
>>> for country in countries:
...     print(country)
... 
Denmark
Finland
Norway
Sweden

不詳述了,沒啥可講的

No.4 基本的異常處

與Python的其餘對象同樣,異常也是一個對象,轉換爲字符串時,異常會產生一條消息文本。語法格式:

try:

    try_suite

except exception1 as variable1:

    exception_suite1

...

except exceptionN as variableN:

    exception_suiteN

上面代碼中的「as variable"部分是可選的。咱們也能夠只關心產生了某個特定的異常,而不關心其具體的消息文本。

完整的語法更加複雜,好比,每一個except分支均可以處理多個異常,還有可選的else分支,具體內容之後再寫,這裏點到爲止。

再來看看異常處理的工做邏輯:若是try塊中的suite都正常執行,且沒有產生異常,則except模塊會被跳過;若是try塊中產生了異常,則控制流會當即跳轉到except,那麼產生異常的語句後面的suite均不會被執行。若是發生了異常,而且給定了as variable部分,則在異常處理suite內部,variable引用的是異常對象。

若是異常發生在處理except塊時,或者某個異常不能與任何一個except塊匹配,Python就會在下一個封閉範圍內搜索一個匹配的except塊。異常處理的搜索是向外擴展的,並能夠延展到調用棧內,直到有一個能匹配的異常處理模塊,真的找不到的話,程序將終止,並留下一個未處理的異常,Python會打印回溯信息以及異常的消息文本。

栗子:

s = input("enter an integer:")
try:
    i = int(s)
    print("valid integer entered:", i)
except ValueError as err:
    print(err)

若是輸入一個浮點數

enter an integer:3.5

那麼輸出爲:

alid literal for int() with base 10: '3.5'

在讀的這本書有一個觀點我很認同,說不少教程書籍都把異常處理看成一個高級專題,而且通常都在很靠後纔會去講。實際上了解了異常的產生與處理機制對咱們理解編程語言的工做方式以及如何面對bug都是頗有幫助的。深表贊同!在剛入行時候學的是Java,沒人關心try沒人告訴我還有個try...catch能夠來用,吃了很大虧。因此這裏真的須要重視!廢話完畢,繼續!


要素#6:算術操做符

這裏和其餘編程語言差很少,+-*/ += -= *=等等。

須要注意的,以下:

>>> 12/5
2.4

懂了嗎?除法結果不是整數,是浮點值!若是要獲得整數能夠用int()轉一下,或者用剝離操做符//(後面再說這個)

另外,咱們前面說過int類型是固定的,也就是說,一旦賦值,就不能改變,所以,咱們在作相似a+=a這樣的操做的時候,其實是建立一個新的int對象來存儲結果,而後將對象引用的指向改變到這個新的int對象上,而且若是原先的int對象沒有被其餘對象引用引用,那麼將被Python送入垃圾回收流程。

還有一個,a operator = b與a=a operator b雖然結果同樣,可是過程是不同的。前者只查詢了一次a的值,後者要查詢兩次,因此前者效率更高更快!

在對列表List使用+=的時候,原始的List對象會被修改,所以不像固定數據類型,List此時是不會被從新綁定引用的。

題外話,大家考慮過這個問題嗎,Python在可變與固定的數據類型上作了處理,使咱們沒法直接看到二者的區別,那麼,爲何還要設定這兩種數據類型?統一使用一種不就行了?


要素#7:輸入/輸出

一個完整的程序是須要交互的,交互是啥?就是輸入和輸出啊!

前面咱們有用到print(),這就是輸出的一種。

Python提供了內置的input()函數,用於接收來自用戶的輸入。

這個實在沒啥講的,本身去試吧。


要素#8:函數的建立與調用

這個也很少說了,下午開始邊看書邊寫,最後這一個要素感受寫不動了。。。草草收場睡覺去。。。

格式:

def functionName(arguments):

        suite

arguments是可選的,若是有多個參數,就必須使用逗號分隔。

每一個Python函數有一個返回值,默認狀況下爲None,除非咱們使用return value來從函數返回,此時value便是實際的返回值。返回值能夠是一個,也能夠是一組。

def是一條魚賦值操做符工做方式相似的語句,執行def時,會建立一個函數對象,同時建立一個帶有指定名的對象引用。因爲函數也是對象,所以能夠存儲在組合數據類型的對象中,並做爲參數傳遞給其餘函數。

關於模塊,Python模塊實際上就是包含Python代碼的.py文件。可使用import導入一個模塊。使用模塊中函數的語法格式是moduleName.functionName(arguments)

栗子:

import random
x=random.randint(1,6)
y=random.choice(["apple","banana","cherry","durian"])

這一篇就寫到這裏吧,都是很淺的內容,後面會根據這些內容作擴展。

這是一個讀書筆記,有不對的地方,不全面的地方,但願你們能指正

發郵件或者留言給我,謝謝^_^

相關文章
相關標籤/搜索