1、定義函數(shù)
成都創(chuàng)新互聯(lián)作為成都網(wǎng)站建設公司,專注網(wǎng)站建設公司、網(wǎng)站設計,有關成都企業(yè)網(wǎng)站定制方案、改版、費用等問題,行業(yè)涉及廣告推廣等多個領域,已為上千家企業(yè)服務,得到了客戶的尊重與認可。
函數(shù)是可重用的程序。本書中已經(jīng)使用了許多內建函數(shù),如len()函數(shù)和range()函數(shù),但是還沒自定義過函數(shù)。定義函數(shù)的語法格式如下:
def 函數(shù)名(參數(shù)):
函數(shù)體
定義函數(shù)的規(guī)則如下:
①關鍵字def用來定義一個函數(shù),它是define的縮寫。
②函數(shù)名是函數(shù)的唯一標識,函數(shù)名的命名規(guī)則遵循標識符的命名規(guī)則。
③函數(shù)名后面一定要緊跟著一個括號,括號內的參數(shù)是可選的,括號后面要有冒號。
④函數(shù)體(statement)為一個或一組Python語句,注意要有縮進。
⑤函數(shù)體的第一行可以有文檔字符串,用于描述函數(shù)的功能,用三引號括起來。
按照定義規(guī)則,可以定義第一個函數(shù)了:
def?hello_world():
...?????print('Hello,world!')???#?注意函數(shù)體要有縮進
...
hello_world()
Hello,world!
這個函數(shù)不帶任何參數(shù),它的功能是打印出“Hello,world!”。最后一行代碼hello_world()是調用函數(shù),即讓Python執(zhí)行函數(shù)的代碼。
2、全局變量和局部變量
全局變量是定義在所有函數(shù)外的變量。例如,定義一個全局變量a,分別在函數(shù)test1()和test2()使用變量a:
a?=?100???#?全局變量
def?test1():
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
test2()
100
定義了全局變量a之后,在函數(shù)test1()和test2()內都可以使用變量a,由此可知,全局變量的作用范圍是全局。
局部變量是在函數(shù)內定義的變量,除了用關鍵字global修飾的變量以外。例如,在函數(shù)test1()內定義一個局部變量a,分別在函數(shù)外和另一個函數(shù)test2()內使用變量a:
def?test1():
...?????a?=?100???#?局部變量
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
print(a)
Traceback?(most?recent?call?last):
File?"stdin",?line?1,?in?module
NameError:?name?'a'?is?not?defined
test2()
Traceback?(most?recent?call?last):
File?"stdin",?line?1,?in?module
File?"stdin",?line?2,?in?test2
NameError:?name?'a'?is?not?defined
Python解釋器提示出錯了。由于局部變量a定義在函數(shù)test1()內,因此,在函數(shù)test1()內可以使用變量a,但是在函數(shù)外或者另一個函數(shù)test2()內使用變量a,都會報錯,由此可見,局部變量的作用范圍是定義它的函數(shù)內部。
一般情況下,在函數(shù)內聲明的變量都是局部變量,但是采用關鍵字global修飾的變量卻是全局變量:
def?test1():
...?????global?a???#?全局變量
...?????a?=?100
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
print(a)
100
test2()
100
這個程序與上個程序相比,只是在函數(shù)test1()中多了一行代碼“global a”,程序便可以正確運行了。在函數(shù)test1()中,采用關鍵字global修飾了變量a之后,變量a就變成了全局變量,不僅可以在該函數(shù)內使用,還可以在函數(shù)外或者其他函數(shù)內使用。
如果在某個函數(shù)內局部變量與全局變量同名,那么在該函數(shù)中局部變量會覆蓋全局變量:
a?=?100???#?全局變量
def?test1():
...?????a?=?200???#?同名局部變量
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
200
test2()
100
由于在函數(shù)test1()中定義了一個與全局變量同名的局部變量a,因此,在函數(shù)test1()中全局變量a的值被局部變量覆蓋了,但是在函數(shù)test2()中全局變量a的值沒有被覆蓋。
綜上所述,在Python中,全局變量保存的數(shù)據(jù)供整個腳本文件使用;而局部變量只用于臨時保存數(shù)據(jù),變量僅供局部代碼塊使用。
按照您的code,代碼是無法編譯的,簡單的例證見圖片。
另外,您的代碼是不是應該這樣:
def?interval(start,stop=None,step=1):
if?stop?is?None:
start,stop=0,start
step=1
print?start,'?',stop,'?',step
調用的時interval(10)
結果是?0?10?1
是因為start,stop?=?0,?start?這一句,?把0賦給start,?start的值賦給stop
編程的目的就是為了處理信息,信息則是由各種不同類型的數(shù)據(jù)表示的,對數(shù)據(jù)的進一步處理也會使信息更加豐富和有效。
5.1變量
前面已經(jīng)提到過“變量”這屬語,下面再進一步解釋一下。
在程序運行時,必須把數(shù)據(jù)導入計算機的存儲單元中,但存儲單元的命名是用二進制數(shù)表示的,晦澀難懂。為了方便起見,可以給存儲單元起上一個通俗易懂的名字,即 變量名 。
變量的生命周期和程序的運行周期是相同的,一個程序運行解釋,所占用的存儲空間也就隨之釋放,用變量名表示的數(shù)據(jù)所占用的這個存儲單元也就空閑了。
變量名的命名規(guī)則:
由字母、數(shù)字、下劃線構成,必須由字母開頭。
不能包含-、*、?、#、、;、/、、@、%、$、空格等特殊字符。
最好使用有含義的英文單詞或漢語拼音。
最好采用小寫字母。
不能使用保留字(已被Python語言系統(tǒng)本身賦予特定意義的單詞)。Python的保留字如下表所示。
Python保留字列表
Python是區(qū)分大小寫的,雖然可以將一個英文單詞通過字母大小寫不同而作為不同變量的變量名,但從程序可讀性的角度看,的確不可取。
Python是一種動態(tài)類型的語言,變量的類型由變量的值決定。換而言之,給變量賦何種類型的值,變量就是該值的類型。給變量賦值可以通過賦值號(=)來實現(xiàn)。如:
myvar=100
type(myvar)
myvar='tom'
type(myvar)
在這個例子中,變量myvar首先賦值為100,顯而易見,100是個整數(shù),通過type()這個函數(shù)檢測,變量myvar的類型為整數(shù)類型(int);接下來變量myvar賦值為‘tom’,通過type()這個函數(shù)檢測,變量myvar的類型改變?yōu)樽址愋?str)。
不僅可以給一個變量賦值為常量,也可以賦值為另一個變量。如:
a=100
b=a
b
100
在這個例子中,“b=a”的實際意義是,變量b和變量a指向同一個存儲單元,既然是同一個存儲單元,變量b和變量a本質上就是完全相同的,這就好比一個人除了本名之外,還有其他的名字,如筆名、昵稱、乳名等等,雖然本質一樣,但是可以在不同場合使用。
5.2關于Python的常量問題
在大多數(shù)語言中都有常量這個概念,但是Python卻沒有。其實仔細想想也好像沒有設置常量的必要,只要一個變量的值不發(fā)生變化,即不給變量重新賦值,它的值當然不會變化,它便是個常量。
5.3基本數(shù)據(jù)類型
5.3.1整數(shù)型和浮點數(shù)
整數(shù)型(integer),可以是正整數(shù)、負整數(shù)和0,可以是十進制、八進制、二進制等。
浮點數(shù)(float),由整數(shù)部分和小數(shù)部分組成,主要用于處理包括小數(shù)的數(shù)。浮點數(shù)也可以用科學計數(shù)法表示。
5.3.2 字符串類型
字符串類型是由一系列的字母或者其他符號組成的數(shù)據(jù)序列,通常用單引號、雙引號或三引號括起來。
用單引號和雙引號括起來的字符串只能放在同一行,用三引號括起來的字符串可以分布在連續(xù)多行上。如:
name='我的名字叫王小明'
old="今年6歲"
introduce='''我想說: 我是中國娃
愛講普通話
要學習寫標準的漢字'''
print(name)
print(old)
print(introduce)
運行結果為:我的名字叫王小明
今年6歲
我想說: 我是中國娃
愛講普通話
要學習寫標準的漢字
不管是哪一種引號形式,括起來的部分是一個整體,包括空格和換行符都屬于字符串的一部分。
為了保證特殊的輸出效果,Python中的字符串支持轉義字符,可使用反斜杠“”對一些特殊字符進行轉義。常用的轉義字符如下:
續(xù)行符
換行符
空
水平制表符
” 雙引號
’ 單引號
一個反斜杠
f 換頁
其中,續(xù)行符(“”)用于當一個字符串在一行寫不下時用續(xù)行符進行連接,但通常更多的采用小括號“()”即可。
如:
第一種方法采用續(xù)行符(“”):
str="A thousand wishes, a thousand plans and
a thousand resolutions are better than one action!"
print(str)
A thousand wishes, a thousand plans and a thousand resolutions are better than one action!
第二種方法采用小括號():
str=("A thousand wishes, a thousand plans and "
"a thousand resolutions are better than one action!")
print(str)
A thousand wishes, a thousand plans and a thousand resolutions are better than one action!
下面舉例說明換行符(“ ”)的用法:
str=" 登鸛雀樓 白日依山盡, 黃河入海流。 欲窮千里目, 更上一層樓。 "
print(str)
登鸛雀樓
白日依山盡,
黃河入海流。
欲窮千里目,
更上一層樓。
下面舉例說明使用轉義字符輸出雙引號(“)的方法:
str="王之渙的詩《登鸛雀樓》中這樣寫道:" 白日依山盡,黃河入海流。欲窮千里目,更上一層樓。""
print(str)
王之渙的詩《登鸛雀樓》中這樣寫道:" 白日依山盡,黃河入海流。欲窮千里目,更上一層樓。"
5.3.3布爾類型
布爾類型用來表示邏輯值,所謂邏輯判斷的結果,不外乎“真”或“假”兩種情況。在Python中“真”用True表示,“假”用False表示。如果布爾類型的變量參與算數(shù)運算,則True被當作1,F(xiàn)alse被當作0。
如:
result=True
print(result)
True
print(result+1)
2
result=False
print(result)
False
print(result+1)
1
5.3.4類型強制轉換
Python是一種弱數(shù)據(jù)類型語言,可以通過給變量重新賦值的方法改變數(shù)據(jù)類型。但有時為了強制改變數(shù)據(jù)類型,就要使用類型轉換函數(shù)來改變。
譬如,為了從鍵盤讀入成績的數(shù)據(jù),可以用float()函數(shù)將input()語句讀入的字符串轉換為浮點數(shù),再賦值給變量score。
score=input("請輸入您的成績:")
請輸入您的成績:96.5 (從鍵盤輸入96.5)
為了計算成績比及格線高了多少分,使用下面的命令,發(fā)現(xiàn)出現(xiàn)了錯誤提示如下:
score-60
Traceback (most recent call last):
File " ", line 1, in
score-60
TypeError: unsupported operand type(s) for -: 'str' and 'int'
這是屬于類型錯誤,原因是從鍵盤讀入的成績值(96.5)并非數(shù)值類型,不能參與算數(shù)運算。用type()函數(shù)可以進一步查詢變量score的數(shù)據(jù)類型。
type(score)
使用float()函數(shù)進行強制轉換后,就可以解決上述問題:
score=float(input("請輸入您的成績:"))
請輸入您的成績:96.5
score=float(score)
type(score)
score-60
36.5
下表列舉了一些常用的類型轉換函數(shù):
Python內置函數(shù)有很多,為大家推薦5個神仙級的內置函數(shù):
(1)Lambda函數(shù)
用于創(chuàng)建匿名函數(shù),即沒有名稱的函數(shù)。它只是一個表達式,函數(shù)體比def簡單很多。當我們需要創(chuàng)建一個函數(shù)來執(zhí)行單個操作并且可以在一行中編寫時,就可以用到匿名函數(shù)了。
Lamdba的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
利用Lamdba函數(shù),往往可以將代碼簡化許多。
(2)Map函數(shù)
會將一個函數(shù)映射到一個輸入列表的所有元素上,比如我們先創(chuàng)建了一個函數(shù)來返回一個大寫的輸入單詞,然后將此函數(shù)應有到列表colors中的所有元素。
我們還可以使用匿名函數(shù)lamdba來配合map函數(shù),這樣可以更加精簡。
(3)Reduce函數(shù)
當需要對一個列表進行一些計算并返回結果時,reduce()是個非常有用的函數(shù)。舉個例子,當需要計算一個整數(shù)列表所有元素的乘積時,即可使用reduce函數(shù)實現(xiàn)。
它與函數(shù)的最大的區(qū)別就是,reduce()里的映射函數(shù)(function)接收兩個參數(shù),而map接收一個參數(shù)。
(4)enumerate函數(shù)
用于將一個可遍歷的數(shù)據(jù)對象(如列表、元組或字符串)組合為一個索引序列,同時列出數(shù)據(jù)和數(shù)據(jù)下標,一般用在for循環(huán)當中。
它的兩個參數(shù),一個是序列、迭代器或其他支持迭代對象;另一個是下標起始位置,默認情況從0開始,也可以自定義計數(shù)器的起始編號。
(5)Zip函數(shù)
用于將可迭代的對象作為參數(shù),將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的列表
當我們使用zip()函數(shù)時,如果各個迭代器的元素個數(shù)不一致,則返回列表長度與最短的對象相同。