這兩天斷斷續(xù)續(xù)看了看Python開發(fā)相關(guān)的教程(入門級(jí)),教程來(lái)自于廖雪峰的Python教程,算是比較適合新手的教程了,幾乎不需要你事先了解任何的編程相關(guān)支持,直接就能上手。
說說這兩天學(xué)的吧,首先學(xué)習(xí)一種計(jì)算機(jī)語(yǔ)言肯定是先搭建好這種語(yǔ)言的開發(fā)環(huán)境,這樣你才能敲出hello world嘛。其實(shí)Python的開發(fā)環(huán)境搭建非常簡(jiǎn)單,Mac自帶Python2,如果需要使用Python3,直接去Python官網(wǎng)下載就行,安裝也十分簡(jiǎn)單,不會(huì)就自行百度 OR Google,這里就不說了。
另外如果你需要編寫Python程序,或者執(zhí)行.py文件,你還需要下載一個(gè)合適的Python解釋器,其實(shí)就是執(zhí)行你的Python程序或文件的應(yīng)用,市面上有很多,我使用的是 JetBrains 公司開發(fā)的 Pycharm ,個(gè)人覺得還不錯(cuò)。
Hello World!
上面兩樣?xùn)|西準(zhǔn)備好之后,就可以學(xué)習(xí)Python了,按照學(xué)習(xí)計(jì)算機(jī)語(yǔ)言的慣例,先來(lái)一波Hello World!,代碼如下:
print('Hello World!')
是不是簡(jiǎn)單極了?一行代碼搞定,也不需要各種import引入各種庫(kù)啥的。讓我們看看其他幾種語(yǔ)言的Hello World程序?qū)懛ǎ?/p>
- C/C++
#include
int main()
{
printf("Hello World!/n");
return 0;
}
- C#
using System;
class Hello
{
public static void Main()
{
Console.WriteLine("Hello World!");
}
}
- Java
class Hello
{
public static void main(String ars[])
{
System.out.print("Hello World!/n");
}
}
哎喲,這些玩意兒真麻煩,果然是Python簡(jiǎn)潔、優(yōu)雅。當(dāng)然還有其他的語(yǔ)言也挺簡(jiǎn)潔的,例如Ruby。
簡(jiǎn)單數(shù)據(jù)類型
然后,我們瞧瞧比較基礎(chǔ)的數(shù)據(jù)類型這一塊。Python中的支持的數(shù)據(jù)類型有以下幾種:
- 整數(shù)
Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù),在程序中的表示方法和數(shù)學(xué)上的寫法一模一樣,如:1,100,-8080,0,等等。另外除了十進(jìn)制,二進(jìn)制、八進(jìn)制、十六進(jìn)制也是支持的。
- 浮點(diǎn)數(shù)
浮點(diǎn)數(shù)其實(shí)就是我們數(shù)學(xué)中經(jīng)常用到的小數(shù),之所以叫做浮點(diǎn)數(shù),因?yàn)榘凑湛茖W(xué)計(jì)數(shù)法的表示方法,小數(shù)的小數(shù)點(diǎn)位置是可以變化的。
浮點(diǎn)數(shù)可以直接用數(shù)學(xué)中的小數(shù)寫法來(lái)寫,例如0.01、3.1415、-10.0等。但是對(duì)于很大或者很小的浮點(diǎn)數(shù),就必須使用科學(xué)計(jì)數(shù)法來(lái)表述,把科學(xué)計(jì)數(shù)法中的10用e替代,1.23e9,12.3e8,0.000012可以寫成1.2e-5等。
- 字符串
字符串是以單引號(hào)'或雙引號(hào)"括起來(lái)的任意文本,比如'abc',"xyz"等等。請(qǐng)注意,''或""本身只是一種表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c這3個(gè)字符。如果'本身也是一個(gè)字符,那就可以用""括起來(lái),比如"I'm OK"包含的字符是I,',m,空格,O,K這6個(gè)字符。
TIPS:如果字符串內(nèi)部既包含
'又包含"怎么辦?可以用轉(zhuǎn)義字符\來(lái)標(biāo)識(shí),比如:print('I\' \"OK\"!')輸入的結(jié)果是:I'm OK!
- 布爾值
布爾值和布爾代數(shù)的表示完全一致,一個(gè)布爾值只有True、False兩種值,要么是True,要么是False,在Python中,可以直接用True、False表示布爾值(請(qǐng)注意大小寫)。
- 空值
空值是Python里一個(gè)特殊的值,用None表示。None不能理解為0,因?yàn)?code>0是有意義的,而None是一個(gè)特殊的空值。
此外,Python還提供了列表、字典等多種數(shù)據(jù)類型,還允許創(chuàng)建自定義數(shù)據(jù)類型,后面我學(xué)習(xí)到那兒的時(shí)候再說這個(gè)。
變量
變量的概念基本上和初中代數(shù)的方程變量是一致的,只是在計(jì)算機(jī)程序中,變量不僅可以是數(shù)字,還可以是任意數(shù)據(jù)類型。
變量在程序中就是用一個(gè)變量名表示了,變量名必須是大小寫英文、數(shù)字和_的組合,且不能用數(shù)字開頭,比如:
a = 1
變量a是一個(gè)整數(shù)。
t_007 = 'T007'
變量t_007是一個(gè)字符串。
Answer = True
變量Answer是一個(gè)布爾值True。
在Python中,等號(hào)=是賦值語(yǔ)句,可以把任意數(shù)據(jù)類型賦值給變量,同一個(gè)變量可以反復(fù)賦值,而且可以是不同類型的變量,例如:
a = 123 # a是整數(shù)
print(a)
a = 'ABC' # a變?yōu)樽址?print(a)
這種變量本身類型不固定的語(yǔ)言稱之為動(dòng)態(tài)語(yǔ)言,與之對(duì)應(yīng)的是靜態(tài)語(yǔ)言。靜態(tài)語(yǔ)言在定義變量時(shí)必須指定變量類型,如果賦值的時(shí)候類型不匹配,就會(huì)報(bào)錯(cuò)。例如Java是靜態(tài)語(yǔ)言,賦值語(yǔ)句如下(// 表示注釋):
int a = 123; // a是整數(shù)類型變量
a = "ABC"; // 錯(cuò)誤:不能把字符串賦給整型變量
和靜態(tài)語(yǔ)言相比,動(dòng)態(tài)語(yǔ)言更靈活,就是這個(gè)原因。
請(qǐng)不要把賦值語(yǔ)句的等號(hào)等同于數(shù)學(xué)的等號(hào)。比如下面的代碼:
x = 10
x = x + 2
如果從數(shù)學(xué)上理解x = x + 2那無(wú)論如何是不成立的,在程序中,賦值語(yǔ)句先計(jì)算右側(cè)的表達(dá)式x + 2,得到結(jié)果12,再賦給變量x。由于x之前的值是10,重新賦值后,x的值變成12。
最后,理解變量在計(jì)算機(jī)內(nèi)存中的表示也非常重要。當(dāng)我們寫:
a = 'ABC'
時(shí),Python解釋器干了兩件事情:
- 在內(nèi)存中創(chuàng)建了一個(gè)
'ABC'的字符串; - 在內(nèi)存中創(chuàng)建了一個(gè)名為
a的變量,并把它指向'ABC'。
也可以把一個(gè)變量a賦值給另一個(gè)變量b,這個(gè)操作實(shí)際上是把變量b指向變量a所指向的數(shù)據(jù),例如下面的代碼:
a = 'ABC'
b = a
a = 'XYZ'
print(b)
最后一行打印出變量b的內(nèi)容到底是'ABC'呢還是'XYZ'?如果從數(shù)學(xué)意義上理解,就會(huì)錯(cuò)誤地得出b和a相同,也應(yīng)該是'XYZ',但實(shí)際上b的值是'ABC',讓我們一行一行地執(zhí)行代碼,就可以看到到底發(fā)生了什么事:
執(zhí)行a = 'ABC',解釋器創(chuàng)建了字符串'ABC'和變量a,并把a指向'ABC':
執(zhí)行b = a,解釋器創(chuàng)建了變量b,并把b指向a指向的字符串'ABC':
執(zhí)行a = 'XYZ',解釋器創(chuàng)建了字符串'XYZ',并把a的指向改為'XYZ',但b并沒有更改:
所以,最后打印變量b的結(jié)果自然是'ABC'了。
常量
所謂常量就是不能變的變量,比如常用的數(shù)學(xué)常數(shù)π就是一個(gè)常量。在Python中,通常用全部大寫的變量名表示常量:
PI = 3.14159265359
但事實(shí)上PI仍然是一個(gè)變量,Python根本沒有任何機(jī)制保證PI不會(huì)被改變,所以,用全部大寫的變量名表示常量只是一個(gè)習(xí)慣上的用法,如果你一定要改變變量PI的值,也沒人能攔住你。
最后解釋一下整數(shù)的除法為什么也是精確的。在Python中,有兩種除法,一種除法是/:
>>> 10 / 3
3.3333333333333335
/除法計(jì)算結(jié)果是浮點(diǎn)數(shù),即使是兩個(gè)整數(shù)恰好整除,結(jié)果也是浮點(diǎn)數(shù):
>>> 9 / 3
3.0
還有一種除法是//,稱為地板除,兩個(gè)整數(shù)的除法仍然是整數(shù):
>>> 10 // 3
3
你沒有看錯(cuò),整數(shù)的地板除//永遠(yuǎn)是整數(shù),即使除不盡。要做精確的除法,使用/就可以。
因?yàn)?code>//除法只取結(jié)果的整數(shù)部分,所以Python還提供一個(gè)余數(shù)運(yùn)算,可以得到兩個(gè)整數(shù)相除的余數(shù):
>>> 10 % 3
1
無(wú)論整數(shù)做//除法還是取余數(shù),結(jié)果永遠(yuǎn)是整數(shù),所以,整數(shù)運(yùn)算結(jié)果永遠(yuǎn)是精確的。
條件判斷
計(jì)算機(jī)之所以能做很多自動(dòng)化的任務(wù),因?yàn)樗梢宰约鹤鰲l件判斷。
比如,輸入用戶年齡,根據(jù)年齡打印不同的內(nèi)容,在Python程序中,用if語(yǔ)句實(shí)現(xiàn):
age = 20
if age >= 18:
print('your age is', age)
print('adult')
根據(jù)Python的縮進(jìn)規(guī)則,如果if語(yǔ)句判斷是True,就把縮進(jìn)的兩行print語(yǔ)句執(zhí)行了,否則,什么也不做。
也可以給if添加一個(gè)else語(yǔ)句,意思是,如果if判斷是False,不要執(zhí)行if的內(nèi)容,去把else執(zhí)行了:
age = 3
if age >= 18:
print('your age is', age)
print('adult')
else:
print('your age is', age)
print('teenager')
注意不要少寫了冒號(hào):。
當(dāng)然上面的判斷是很粗略的,完全可以用elif做更細(xì)致的判斷:
age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid')
elif是else if的縮寫,完全可以有多個(gè)elif,所以if語(yǔ)句的完整形式就是:
if <條件判斷1>:
<執(zhí)行1>
elif <條件判斷2>:
<執(zhí)行2>
elif <條件判斷3>:
<執(zhí)行3>
else:
<執(zhí)行4>
if語(yǔ)句執(zhí)行有個(gè)特點(diǎn),它是從上往下判斷,如果在某個(gè)判斷上是True,把該判斷對(duì)應(yīng)的語(yǔ)句執(zhí)行后,就忽略掉剩下的elif和else,所以,請(qǐng)測(cè)試并解釋為什么下面的程序打印的是teenager:
age = 20
if age >= 6:
print('teenager')
elif age >= 18:
print('adult')
else:
print('kid')
if判斷條件還可以簡(jiǎn)寫,比如寫:
if x:
print('True')
只要x是非零數(shù)值、非空字符串、非空l(shuí)ist等,就判斷為True,否則為False。
函數(shù)的調(diào)用與定義
- 函數(shù)調(diào)用
Python內(nèi)置了很多有用的函數(shù),我們可以直接調(diào)用。
要調(diào)用一個(gè)函數(shù),需要知道函數(shù)的名稱和參數(shù),比如求絕對(duì)值的函數(shù)abs,只有一個(gè)參數(shù)。
也可以在交互式命令行通過help(abs)查看abs函數(shù)的幫助信息。調(diào)用abs函數(shù):
>>> abs(100)
100
>>> abs(-20)
20
>>> abs(12.34)
12.34
調(diào)用函數(shù)的時(shí)候,如果傳入的參數(shù)數(shù)量不對(duì),會(huì)報(bào)TypeError的錯(cuò)誤,并且Python會(huì)明確地告訴你:abs()有且僅有1個(gè)參數(shù),但給出了兩個(gè):
>>> abs(1, 2)
Traceback (most recent call last):
File "", line 1, in
TypeError: abs() takes exactly one argument (2 given)
如果傳入的參數(shù)數(shù)量是對(duì)的,但參數(shù)類型不能被函數(shù)所接受,也會(huì)報(bào)TypeError的錯(cuò)誤,并且給出錯(cuò)誤信息:str是錯(cuò)誤的參數(shù)類型:
>>> abs('a')
Traceback (most recent call last):
File "", line 1, in
TypeError: bad operand type for abs(): 'str'
而max函數(shù)max()可以接收任意多個(gè)參數(shù),并返回最大的那個(gè):
>>> max(1, 2)
2
>>> max(2, 3, 1, -5)
3
- 函數(shù)定義
在Python中,定義一個(gè)函數(shù)要使用def語(yǔ)句,依次寫出函數(shù)名、括號(hào)、括號(hào)中的參數(shù)和冒號(hào):,然后,在縮進(jìn)塊中編寫函數(shù)體,函數(shù)的返回值用return語(yǔ)句返回。
我們以自定義一個(gè)求絕對(duì)值的my_abs函數(shù)為例:
def my_abs(x):
if x >= 0:
return x
else:
return -x
請(qǐng)自行測(cè)試并調(diào)用my_abs看看返回結(jié)果是否正確。
請(qǐng)注意,函數(shù)體內(nèi)部的語(yǔ)句在執(zhí)行時(shí),一旦執(zhí)行到return時(shí),函數(shù)就執(zhí)行完畢,并將結(jié)果返回。因此,函數(shù)內(nèi)部通過條件判斷和循環(huán)可以實(shí)現(xiàn)非常復(fù)雜的邏輯。
如果沒有return語(yǔ)句,函數(shù)執(zhí)行完畢后也會(huì)返回結(jié)果,只是結(jié)果為None。return None可以簡(jiǎn)寫為return。
下次再會(huì)~