4.調用函數
(1)Python 內置了不少有用的函數,咱們能夠直接調用:
abs() ##########求絕對值
cmp() #########比較大小
fact() #############遞歸函數實現java
練習:
############實現遞歸函數####################################################
# n! = 1x2x3x4x.......(n-1)xn= (n-1)!xn = (n-2)!x(n-1)xn
1! = 1
2! = (2-1)! x 2 = fact(2-1) x 2
3! = (3-1)! x 3 = (2-1)! x 2 x 3 = fact(3-1) x 3 = fact(1)x 2 x3
###########
代碼:
def fact(n):
if not isinstance(n,int):
print 'input int num'
if n==1:
return 1 ###遞歸結束條件,當n==1時,結束
return fact(n-1)*n
print fact(10)
print fact(1)
注意:
1:在寫遞歸函數時要有一個明確的結束條件。
2:在遞歸時,問題規模要愈來愈小。
3:遞歸函數效率不高,函數調用是經過棧的數據結構實現的,每調用一次,棧就會多一層,最多999層,不然會出現棧溢出。
截圖:
#################################實現二分效果############################
當n=10時
返回值爲
5
2
1
代碼:
def fun(n): ##########n是形式參數
if not isinstance(n, int):
print 'input int num'
print n
b = int(n/2)
if b >0:
return fun(b)
fun (10)
截圖:python
(2)數據類型轉換函數:
int(), float(), str(),unicode(),bool()
5.理解函數名
函數名與變量名相似,其實就是指向一個函數對象的引用;
給這個函數起了一個「別名」:函數名賦給一個變量空函數
6.變量的做用域
局部變量:只能在函數內部使用的變量
全局變量:在整個程序中使用的變量
global關鍵字:強制將局部變量轉換爲全局變量
代碼分析:
b=2 #############全局變量,在整個代碼中生效。
def a():
b=1 ###########局部變量,只在函數內生效。
print b
a()
print b
截圖:雖然給b賦值爲1,但由於是局部變量因此輸出b爲2nginx
代碼分析:
b=2
def a(): #############全局變量,在整個代碼中生效。
global b ##########聲明變量
b=1 ###########局部變量,只在函數內生效。
print b
a()
print b
截圖:
##################函數式編程#############################
面向對象編程語言:java ,c++,python
面向過程編程語言:C
面向函數編程語言:(lisp,erlang)
截圖:
##############高級特性#############
1.列表生成式
列表生成式是Python 內置的很是簡單卻強大的能夠用來建立list的生成式
方法一:for循環
方法二:列表生成式
(1)思考:
要生成 list [1, 2, 3, 4, 5, 6, 7] 能夠用 range(1, 8)
但若是要生成 [1x1, 2x2, 3x3, ..., 7x7] 怎麼作?
代碼:
list1=[] ###########建一個空列表接收執行結果
list = range(1,8)######創建一個列表
for x in list: #####list1 中的值來源
a =x*x
list1.append(a) ###list1列表值的增長
print list1
截圖:c++
(2)思考:
列表生成式能夠嵌套if語句和for語句麼?
- 生成100之內全部偶數的平方;
- 生成‘ABC’與‘123’的全排列;
編程
(3)思考:
列表生成式也能夠使用兩個變量來生成 list麼?
- 生成字典的的內容,格式爲‘key=value’,返回其列表
格式;
- 將list中全部的字符串變爲小寫字母;tomcat
2.迭代
能夠經過 for 循環來遍歷這個 list 或 tuple,這種遍歷咱們稱爲迭代(Iteration)
只要是可迭代對象,不管有無下標,均可以迭代,好比 dict就能夠迭代:
(1)如何判斷一個對象是可迭代對象呢?
方法是經過 collections 模塊的 Iterable 類型判斷迭代
from collections import Iterable########導入 collections 模塊的 Iterable 類型
isinstance('hello',Iterable) ######判斷字符串是不是迭代
Out[9]: True
isinstance(1,Iterable) ######判斷×××是不是迭代
Out[10]: False
isinstance([1,2,3],Iterable) ######判斷列表是不是迭代
Out[11]: True
isinstance({1,2,3},Iterable) ######判斷集合是不是迭代
Out[12]: True
isinstance({"name":"zhang"},Iterable)######判斷字典是不是迭代
Out[13]: True
isinstance((1,2,3),Iterable) ######判斷元組是不是迭代
Out[14]: True
(2)枚舉方法,顯示爲索引元素對。
代碼:
shopinfo =[
('Iphone',1000),
('book',200),
('fentiao',3500)
]
for i ,v in enumerate(shopinfo):
print i,v
截圖:
數據結構
(3)for 循環裏,同時引用了兩個變量。
代碼:
shopinfo =[
('Iphone',1000),
('book',200),
('fentiao',3500)
]
for k,v in shopinfo:
print k,v
截圖:app
3.生成器
(1)爲何須要生成器?
經過列表生成式,咱們能夠直接建立一個列表,受到內存限制,列表容量確定是有限的;
建立一個包含 100 萬個元素的列表,佔用很大的存儲空間;列表生成若是須要前幾個元素,浪費空間
(2)生成器是什麼?
在循環的過程當中不斷推算出後續的元素呢?這樣就沒必要建立完整的list,從而節省大量的空間。在 Python 中,這種一
邊循環一邊計算的機制,稱爲生成器(Generator)
(3)怎麼建立生成器?把一個列表生成式的 [] 改爲 ()
使用g.next()方法依次讀取元素(麻煩)
截圖:異步
使用 for 循環(推薦)
代碼:
l= (i for i in range(10)) ############列表生成式
g= (i for i in range(10)) ##########生成器
from collections import Iterable
isinstance(g,Iterable) #####查看生成器是否迭代
Out[4]: True
type(g) #########查看g的類型
Out[5]: generator
for i in g: #####3使用 for 循環
if i < 5:
print i
0
1
2
3
4
截圖:
(4)python編程:
著名的斐波拉契數列(Fibonacci),除第一個和第二個數
外,任意一個數均可由前兩個數相加獲得:1, 1, 2, 3,5, 8, 13, 21,...編程語言
代碼:
def fib(max):
n,a,b=0,0,1
while n < max:
print b
a,b = b,a+b
n +=1
fib(4)
截圖:
(4)手動實現生成器:
########yield關鍵字#########
練習:經過改變如下代碼,而後觀察結果,瞭解yield關鍵字
def hello():
print 'a'
yield 1
print 'b'
yield 2
print 'c'
yield 3
a = hello()
print type(a)
print a.next()
print a.next()
print a.next()
截圖多個:
斐波拉契數列使用yield關鍵字截圖:
(5)異步I/O模型epoll http nginxtomcat
消費者代碼:
def consumer(name):
print '%s 準備吃粉條了!' %(name)
while True:
fentiao = yield
print('粉條[%s]作出來了,被[%s]吃了')%(fentiao,name)
g = consumer("xiaobai")
g.next()
g.send('孜然味')
截圖:
生產者代碼:
import time
def producer(name):
c1 = consumer('xiaobai')
c2 = consumer('heidong')
c1.next()
c2.next()
print '開始製做粉條晚餐了.....'
for i in range(1,6):
time.sleep(1)
print '[%s]作了兩份粉條,兩我的一塊兒吃'%(name)
c1.send(i)
c2.send(i)
producer('diner')
截圖: