第二章、變量和簡(jiǎn)單數(shù)據(jù)類型
2.1 運(yùn)行hello_world.py時(shí)發(fā)生的情況
運(yùn)行文件hello_world.py時(shí),末尾的.py指出這是一個(gè)Python程序,因此編輯器將使用Python解釋器 來(lái)運(yùn)行它。Python解釋器讀取整個(gè)程序,確定其中每個(gè)單詞的含義。例如,看到單詞print 時(shí),解釋器就會(huì)將括號(hào)中的內(nèi)容打印到屏幕,而不會(huì)管括號(hào)中的內(nèi)容是什么。
編寫程序時(shí),編輯器會(huì)以各種方式突出程序的不同部分。例如,它知道print 是一個(gè)函數(shù)的名稱,因此將其顯示為藍(lán)色;它知道“Hello Python world!”不是Python代碼,因此將其顯示為橙色。這種功能稱為語(yǔ)法突出。
2.2 變量
在程序中可隨時(shí)修改變量的值,而Python將始終記錄變量的最新值。
message = "Hello Python world!"
print(message)
Hello Python world!
message = "Hello Python Crash Course world!"
print(message)
Hello Python Crash Course world!
2.2.1 變量的命名和使用
- 變量名只能包含字母、數(shù)字和下劃線。變量名可以字母或下劃線打頭,但不能以數(shù)字打頭,例如,可將變量命名為message_1,但不能將其命名為1_message。
- 變量名不能包含空格,但可使用下劃線來(lái)分隔其中的單詞。例如,變量名greeting_message可行,但變量名greeting message會(huì)引發(fā)錯(cuò)誤。
- 不要將Python關(guān)鍵字和函數(shù)名用作變量名,即不要使用Python保留用于特殊用途的單詞,如print。
- 變量名應(yīng)既簡(jiǎn)短又具有描述性。例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好。
- 慎用小寫字母l和大寫字母O,因?yàn)樗鼈兛赡鼙蝗隋e(cuò)看成數(shù)字1和0。
盡量使用小寫的Python變量名。在變量名中使用大寫字母雖然不會(huì)導(dǎo)致錯(cuò)誤,但避免使用大寫字母是個(gè)不錯(cuò)的主意。
2.2.2 使用變量時(shí)避免命名錯(cuò)誤
程序無(wú)法成功地運(yùn)行時(shí),解釋器會(huì)提供一個(gè)traceback。traceback是一條記錄,指出了解釋器嘗試運(yùn)行代碼時(shí),在什么地方出現(xiàn)問(wèn)題。
下面的程序注意錯(cuò)誤類型:
NameError: name 'mesage' is not defined
message = "Hello Python Crash Course reader!"
print(mesage)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
< ipython-input-3-c8f2adeaed02 > in < module >()
1 message = "Hello Python Crash Course reader!"
---- > 2 print(mesage)
NameError: name 'mesage' is not defined
練習(xí): 2-1 簡(jiǎn)單消息:將一條消息存儲(chǔ)到變量中,再將其打印出來(lái)。2-2 多條簡(jiǎn)單消息:將一條消息存儲(chǔ)到變量中,將其打印出來(lái);再將變量的值修改為一條新消息,并將其打印出來(lái)。
simple_message = "Hello, Simple Message"
print(simple_message)
Hello, Simple Message
multi_message = "Multi Message 1"
print(multi_message)
multi_message = "Multi Message 2"
print(multi_message)
Multi Message 1
Multi Message 2
2.3 字符串
字符串
就是一系列字符。在Python中,用引號(hào)括起的都是字符串,其中的引號(hào)可以是單引號(hào),也可以是雙引號(hào)。
str1 = "Hello, String 1"
print(str1)
str2 = 'Hello, String 2'
print(str2)
str3 = '''Hello, It's String 3'''
print(str3)
Hello, String 1
Hello, String 2
Hello, It's String 3
2.3.1 使用方法修改字符串的大小寫
name = "aDa loveLace"
#執(zhí)行每個(gè)單詞首字母大寫的方法
print(name.title())
#轉(zhuǎn)換為首字母大寫的方法
print(name.capitalize())
#全部轉(zhuǎn)換為大寫的方法
print(name.upper())
#全部轉(zhuǎn)換為小寫的方法
print(name.lower())
Ada Lovelace
Ada lovelace
ADA LOVELACE
ada lovelace
2.3.2 合并(拼接)字符串
first_name = "ada"
last_name = "lovelace"
#字符串拼接
full_name = first_name + " " + last_name
print(full_name)
print("Hello, "+full_name.title()+"!")
#格式化字符串
name = "{} {}".format(first_name,last_name)
print(name)
ada lovelace
Hello, Ada Lovelace!
ada lovelace
2.3.3 使用制表符或換行符來(lái)添加空白
要在字符串中添加制表符,可使用字符組合t;要在字符串中添加換行符,可使用字符組合n。
print("t pythont Hellon t World t In t love t you!n")
python Hello
World I
love you!
2.3.4 刪除空白
下例中,len()用來(lái)查看字符串的長(zhǎng)度。
message = " Python is a good language. "
#去除左空格
print(message.lstrip(), len(message.lstrip()))
#去除右空格
print(message.rstrip(), len(message.rstrip()))
#去除兩邊的空格
print(message.strip(), len(message.strip()))
Python is a good language. 27
Python is a good language. 27
Python is a good language. 26
2.3.5 使用字符串時(shí)避免語(yǔ)法錯(cuò)誤
語(yǔ)法錯(cuò)誤
是指程序中包含非法的Python代碼時(shí),就會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。
例如,在用單引號(hào)括起的字符串中,如果包含撇號(hào),就將導(dǎo)致錯(cuò)誤。這是因?yàn)檫@會(huì)導(dǎo)致Python將第一個(gè)單引號(hào)和撇號(hào)之間的內(nèi)容視為一個(gè)字符串,進(jìn)而將余下的文本視為Python代碼,從而引發(fā)錯(cuò)誤。
message = "One of Python's strengths is its diverse community."
print(message)
One of Python's strengths is its diverse community.
message = 'One of Python's strengths is its diverse community.'
print(message)
File "< ipython-input-12-a9250de55b39 >", line 1
message = 'One of Python's strengths is its diverse community.'
^
SyntaxError: invalid syntax
2.3.6 Python 2中的print 語(yǔ)句
在Python 2中,無(wú)需將要打印的內(nèi)容放在括號(hào)內(nèi)。從技術(shù)上說(shuō),Python 3中的print 是一個(gè)函數(shù),因此括號(hào)必不可少。有些Python 2 print 語(yǔ)句也包含括號(hào),但其行為與Python 3中稍有不同。在Python 2代碼中,print可以包含括號(hào),也可以不包含。
練習(xí):
2-3 個(gè)性化消息:將用戶的姓名存到一個(gè)變量中,并向該用戶顯示一條消息。顯示的消息應(yīng)非常簡(jiǎn)單,如“Hello Eric, would you like to learn some Python today?”。
2-4 調(diào)整名字的大小寫:將一個(gè)人名存儲(chǔ)到一個(gè)變量中,再以小寫、大寫和首字母大寫的方式顯示這個(gè)人名。
2-5 名言:找一句你欽佩的名人說(shuō)的名言,將這個(gè)名人的姓名和他的名言打印出來(lái)。輸出應(yīng)類似于下面這樣(包括引號(hào)):
Albert Einstein once said, “A person who never made a mistake never tried anything new.”
2-6 名言2:重復(fù)練習(xí)2-5,但將名人的姓名存儲(chǔ)在變量famous_person 中,再創(chuàng)建要顯示的消息,并將其存儲(chǔ)在變量message 中,然后打印這條消息。
2-7 剔除人名中的空白:存儲(chǔ)一個(gè)人名,并在其開(kāi)頭和末尾都包含一些空白字符。務(wù)必至少使用字符組合"t" 和"n" 各一次。
打印這個(gè)人名,以顯示其開(kāi)頭和末尾的空白。然后,分別使用剔除函數(shù)lstrip() 、rstrip() 和strip() 對(duì)人名進(jìn)行處理,并將結(jié)果打印出來(lái)。
#2-3
famous_name = 'Albert Einstein'
print("Hello {}, would you like to learn some Python today?".format(famous_name))
#2-4
print(famous_name.lower())
print(famous_name.upper())
print(famous_name.title())
#2-5 & 2-6
famous_clause = 'A person who never made a mistake never tried anything new.'
print('''{} once said, “{}”'''.format(famous_name, famous_clause))
# 2-7
famous_person = '''
albert einstein
'''
print(famous_person.lstrip())
print('----------------------')
print(famous_person.rstrip())
print('----------------------')
print(famous_person.strip())
print('----------------------')
Hello Albert Einstein, would you like to learn some Python today?
albert einstein
ALBERT EINSTEIN
Albert Einstein
Albert Einstein once said, “A person who never made a mistake never tried anything new.”
albert einstein
----------------------
albert einstein
----------------------
albert einstein
----------------------
2.4 數(shù)字
2.4.1 整數(shù)
在Python中,可對(duì)整數(shù)執(zhí)行加(+)減(-)乘(*)除(/)求余(%)運(yùn)算;使用兩個(gè)乘號(hào)(**)表示乘方運(yùn)算;使用括號(hào)來(lái)修改運(yùn)算次序,讓Python按你指定的次序執(zhí)行運(yùn)算。
print(2 + 3)
print(3 - 2)
print(2 * 3)
print(3 / 2)
print(3 % 2)
print(3 ** 2)
print(2 + 3 * 4)
print((2 + 3) * 4)
5
1
6
1.5
1
9
14
20
2.4.2 浮點(diǎn)數(shù)
Python將帶小數(shù)點(diǎn)的數(shù)字都稱為浮點(diǎn)數(shù)。小數(shù)點(diǎn)可出現(xiàn)在數(shù)字的任何位置。
print(0.1 + 0.1)
print(0.2 + 0.2)
print(2 * 0.1)
print(2 * 0.2)
print(0.2 + 0.1)
print(3 * 0.1)
0.2
0.4
0.2
0.4
0.30000000000000004
0.30000000000000004
上面最后兩行的語(yǔ)句在所有語(yǔ)言都存在這種問(wèn)題,沒(méi)有什么可擔(dān)心的。Python會(huì)盡力找到一種方式,以盡可能精確地表示結(jié)果,但鑒于計(jì)算機(jī)內(nèi)部表示數(shù)字的方式,這在有些情況下很難。就現(xiàn)在而言,暫時(shí)忽略多余的小數(shù)位數(shù)即可
2.4.3 使用函數(shù)str() 避免類型錯(cuò)誤
age = 38
message = "Happy " + age + "rd Birthday!"
print(message)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
< ipython-input-16-a9d2b2541859 > in < module >()
1 age = 38
---- > 2 message = "Happy " + age + "rd Birthday!"
3
4 print(message)
TypeError: must be str, not int
age = 38
message = "Happy " + str(age) + "th Birthday!"
print(message)
Happy 38th Birthday!
age = 38
message = "Happy {}th Birthday!".format(age)
print(message)
Happy 38th Birthday!
2.4.4 Python 2中的整數(shù)
在Python 2中,若要避免商被取整,務(wù)必確保至少有一個(gè)操作數(shù)為浮點(diǎn)數(shù),這樣結(jié)果也將為浮點(diǎn)數(shù)。
2.5 注釋
注釋
讓你能夠使用自然語(yǔ)言在程序中添加說(shuō)明。
2.5.1 如何編寫注釋
在Python中,注釋用井號(hào)(#)標(biāo)識(shí)。#號(hào)后面的內(nèi)容都會(huì)被Python解釋器忽略。具體可見(jiàn)上面代碼段中的#用法。
2.5.2 該編寫什么樣的注釋
編寫注釋的主要目的是闡述代碼要做什么,以及是如何做的。在開(kāi)發(fā)項(xiàng)目期間,你對(duì)各個(gè)部分如何協(xié)同工作了如指掌,但過(guò)段時(shí)間后,有些細(xì)節(jié)你可能不記得了。當(dāng)然,你總是可以通過(guò)研究代碼來(lái)確定各個(gè)部分的工作原理,但通過(guò)編寫注釋,以清晰的自然語(yǔ)言對(duì)解決方案進(jìn)行概述,可節(jié)省很多時(shí)間。
要成為專業(yè)程序員或與其他程序員合作,就必須編寫有意義的注釋。當(dāng)前,大多數(shù)軟件都是合作編寫的,編寫者可能是同一家公司的多名員工,也可能是眾多致力于同一個(gè)開(kāi)源項(xiàng)目的人員。訓(xùn)練有素的程序員都希望代碼中包含注釋,因此你最好從現(xiàn)在開(kāi)始就在程序中添加描述性注釋。作為新手,最值得養(yǎng)成的習(xí)慣之一是,在代碼中編寫清晰、簡(jiǎn)潔的注釋。
如果不確定是否要編寫注釋,就問(wèn)問(wèn)自己,找到合理的解決方案前,是否考慮了多個(gè)解決方案。如果答案是肯定的,就編寫注釋對(duì)你的解決方案進(jìn)行說(shuō)明吧。相比回過(guò)頭去再添加注釋,刪除多余的注釋要容易得多。
2.6 Python之禪
import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
評(píng)論
查看更多