python世界level3

本節內容python

1. 函數基本語法及特性算法

2. 參數與局部變量編程

3. 返回值bash

嵌套函數數據結構

4.遞歸ide

5.匿名函數函數式編程

6.函數式編程介紹函數

7.高階函數測試

8.內置函數網站

1. 集合

主要做用: 

  1. 去重
  2. 關係測試, 交集\差集\並集\反向(對稱)差集
     1 #!/usr/bin/env python
     2 #Author:Ponke91
     3 
     4 list_1=[1,2,3,4,5,6,6,2,435,224,2,21,3]
     5 list_1=set(list_1)
     6 list_2=set([1,3,423,4,5123,21])
     7 print(list_1)
     8 print(list_1.intersection(list_2))#取交集
     9 print(list_1.union(list_2))#取並集
    10 print(list_1.difference(list_2))#差集
    11 print(list_2.difference(list_1))#子集
    12 print(list_1.issubset(list_2))
    13 print(list_1.issuperset(list_2)) #父級
    14 print(list_2.symmetric_difference(list_1))#對稱差集,去掉兩個集合中重複得元素
    15 print(list_2.isdisjoint(list_1))#判斷兩個集合是否有交集 若是沒有交集 返回True
    16 print(list_1 & list_2)#交集
    17 print(list_2 | list_1)#並集union
    18 print(list_2 - list_1)#差集
    19 print(list_1 ^ list_2)#對此差集
    20 
    21 #集合增刪改查
    22 print(list_2.add(1))#增長 單個添加
    23 print(list_2.update([3,33,66]))#多個增長
    24 print(list_2.remove(3))#移除 若是移除得數不存在 會報錯
    25 print(list_2.discard(2))#移除,若是移除的元素不存在,值爲假
    26 
    27 print(list_2)
    View Code

     

2. 元組  

只讀列表,只有count, index 2 個方法

做用:若是一些數據不想被人修改, 能夠存成元組,好比身份證列表

#!/usr/bin/env python
#Author:Ponke91

Tuple=("ponke",'dd','33141')#元組不可變只有 ,經常使用來做爲重要參數不可變
print(Tuple.count("ponke"))#count 統計
print(Tuple.index('dd'))#,index 獲取下標
View Code

 

3. 字典

key-value對

  1. 特性:
  2. 無順序
  3. 去重
  4. 查詢速度快,比列表快多了
  5. 比list佔用內存多

爲何會查詢速度會快呢?由於他是hash類型的,那什麼是hash呢?

哈希算法將任意長度的二進制值映射爲較短的固定長度的二進制值,這個小的二進制值稱爲哈希值。哈希值是一段數據惟一且極其緊湊的數值表示形式。若是散列一段明文並且哪怕只更改該段落的一個字母,隨後的哈希都將產生不一樣的值。要找到散列爲同一個值的兩個不一樣的輸入,在計算上是不可能的,因此數據的哈希值能夠檢驗數據的完整性。通常用於快速查找和加密算法

dict會把全部的key變成hash 表,而後將這個表進行排序,這樣,你經過data[key]去查data字典中一個key的時候,python會先把這個key hash成一個數字,而後拿這個數字到hash表中看沒有這個數字, 若是有,拿到這個key在hash表中的索引,拿到這個索引去與此key對應的value的內存地址那取值就能夠了。

 1 #!/usr/bin/env python
 2 #Author:Ponke91
 3 xiaozi={
 4     'stu001':'001',
 5     'stu002':'003',
 6     'stu004':3,
 7     'stu005':['1','2']
 8 
 9 }
10 print(xiaozi['stu005'])
11 xiaozi['stu002']='奧迪'
12 
13 del xiaozi['stu001']
14 xiaozi.pop("stu004")#刪除
15 #xiaozi.popitem()#隨機刪除
16 print(xiaozi)
17 print(xiaozi.get("stu005"))
18 print("stu006" in xiaozi)
19 xiaozi.values()#全部的值
20 xiaozi.setdefault("臺灣",{'www.baidu.com':[1,2]})#使用方式在字典中查找是否存在該值,若是存在不修改直接返回該值,若是不存在則修改
21 xxx={'zhangsan':'lsi','afjals':'111'}
22 xiaozi.update(xxx)#合併兩個列表,重複的值使用XXX更新,沒有的值進行建立
23 xiaozi.items()
24 print(xiaozi.items())#字典轉換成列表
25 t=dict.fromkeys(['1','2','3'],'oooo')#初始化一個字典 內存地址不可變
26 print(t)
View Code

4. 字符編碼

 

先說python2

  1. py2裏默認編碼是ascii
  2. 文件開頭那個編碼聲明是告訴解釋這個代碼的程序 以什麼編碼格式 把這段代碼讀入到內存,由於到了內存裏,這段代碼實際上是以bytes二進制格式存的,不過即便是2進制流,也能夠按不一樣的編碼格式轉成2進制流,你懂麼?
  3. 若是在文件頭聲明瞭#_*_coding:utf-8*_,就能夠寫中文了, 不聲明的話,python在處理這段代碼時按ascii,顯然會出錯, 加了這個聲明後,裏面的代碼就全是utf-8格式了
  4. 在有#_*_coding:utf-8*_的狀況下,你在聲明變量若是寫成name=u"大保健",那這個字符就是unicode格式,不加這個u,那你聲明的字符串就是utf-8格式
  5. utf-8 to gbk怎麼轉,utf8先decode成unicode,再encode成gbk

再說python3

  1. py3裏默認文件編碼就是utf-8,因此能夠直接寫中文,也不須要文件頭聲明編碼了,乾的漂亮
  2. 你聲明的變量默認是unicode編碼,不是utf-8, 由於默認便是unicode了(不像在py2裏,你想直接聲明成unicode還得在變量前加個u), 此時你想轉成gbk的話,直接your_str.encode("gbk")便可以
  3. 但py3裏,你在your_str.encode("gbk")時,感受好像還加了一個動做,就是就是encode的數據變成了bytes裏,我擦,這是怎麼個狀況,由於在py3裏,str and bytes作了明確的區分,你能夠理解爲bytes就是2進制流,你會說,我看到的不是010101這樣的2進制呀, 那是由於python爲了讓你能對數據進行操做而在內存級別又幫你作了一層封裝,不然讓你直接看到一堆2進制,你能看出哪一個字符對應哪段2進制麼?什麼?本身換算,得了吧,你連超過2位數的數字加減運算都費勁,還仍是省省心吧。  
  4. 那你說,在py2裏好像也有bytes呀,是的,不過py2裏的bytes只是對str作了個別名(python2裏的str就是bytes, py3裏的str是unicode),沒有像py3同樣給你顯示的多出來一層封裝,但其實其內部仍是封裝了的。 這麼講吧, 不管是2仍是三, 從硬盤到內存,數據格式都是 010101二進制到-->b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes類型-->按照指定編碼轉成你能看懂的文字

編碼應用比較多的場景應該是爬蟲了,互聯網上不少網站用的編碼格式很雜,雖然總體趨向都變成utf-8,但如今仍是很雜,因此爬網頁時就須要你進行各類編碼的轉換,不過生活正在變美好,期待一個不須要轉碼的世界。

1 #!/usr/bin/env python
2 #Author:Ponke91
3 #-*- encoding:gbk -*-
4 s='你好'
5 print(s.encode('gbk'))
6 print(s.encode('utf-8'))
7 print(s.encode('utf-8').decode('utf-8').encode('gb2312').decode('gb2312'))
View Code

五 函數

一、函數是什麼?

函數一詞來源於數學,但編程中的「函數」概念,與數學中的函數是有很大不一樣的,具體區別,咱們後面會講,編程中的函數在英文中也有不少不一樣的叫法。在BASIC中叫作subroutine(子過程或子程序),在Pascal中叫作procedure(過程)和function,在C中只有function,在Java裏面叫作method。

定義: 函數是指將一組語句的集合經過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名便可

特性:

  1. 減小重複代碼
  2. 使程序變的可擴展
  3. 使程序變得易維護

二、

函數參數與局部變量  

形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。所以,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變量

實參能夠是常量、變量、表達式、函數等,不管實參是何種類型的量,在進行函數調用時,它們都必須有肯定的值,以便把這些值傳送給形參。所以應預先用賦值,輸入等辦法使參數得到肯定值

 1 #!/usr/bin/env python
 2 #Author:Ponke91
 3 def func(n):
 4     print(n)
 5     n=n/2
 6     if int(n/2)==0:
 7         print(n)
 8         return
 9     else:
10         func(n)
11 # x=func(10)
12 # print(x)
View Code
 1 #!/usr/bin/env python
 2 #Author:Ponke91
 3 #函數
 4 def fun1():
 5     "text1"
 6     print("in the func 1")
 7     return 0
 8 x=fun1()
 9 print(x,type)
10 #過程
11 def func2():
12     "text2"
13     print('in the func 2')
14 y=func2()
15 print(y,type)
View Code
 1 #!/usr/bin/env python
 2 # Author:Ponke91
 3 import time
 4 
 5 def logi():
 6     current_time = '%Y-%m-%d %X'
 7     time_format = time.strftime(current_time)
 8     with open('a.txt', 'a+') as f:
 9         f.write("%s xiajibashuoeveryday\n" % time_format)
10 
11 
12 def test1():
13     print("in the test1")
14 
15     logi()
16 
17 
18 def test2():
19     print("in the test2")
20     logi()
21 
22 
23 def test3():
24     print("in the test3")
25     logi()
26 test1()
27 test2()
28 test3()
View Code
 1 #!/usr/bin/env python
 2 #Author:Ponke91
 3 def test1():
 4     print('in the test 1')
 5     #return 0
 6     #print('ddd')
 7 #x=test1()#函數體返回的值
 8 #print(x)
 9 def test2():
10     print('in the test 1')
11     return 0
12 def test3():
13     print('in the test 1')
14     return 1,'hello',['alex','ponke91'],{'name':'ponke'}
15 x=test3()
16 print(x.count(1))
17 #不返回值,則爲none,返回一個值,object,返回多個值,tuple
View Code
 1 #!/usr/bin/env python
 2 # Author:Ponke91
 3 def test(x, y):
 4     x=float(x)
 5     y=float(y)
 6     x_1 = x - 3 + 1
 7     y_1 = y + 2 + 1
 8     print(x_1, y_1)
 9     return x_1, y_1
10 
11 #標準調用,關鍵字一一對應,關鍵字調用,位置無關
12 test(3, 5.2)
View Code
 1 #!/usr/bin/env python
 2 # Author:Ponke91
 3 # def test(x,y=2):#默認參數,若是不賦值就使用默認參數,若是賦值則使用實參。
 4 #     print(x)
 5 #     print(y)
 6 # test(1,3)
 7 # '''def conn(host,prot=3306):
 8 #     pass
 9 # conn(1)'''
10 # def test1(*args):#表明參數數量不固定  接受位置參數轉化成元組
11 #     print(args)
12 # test1(123,41341,535,)
13 # # **kwargs 把關鍵字參數轉化成字典
14 # def test3(**kwargs):
15 #     print(kwargs)
16 #     print(kwargs['name'])
17 # #test3(name='ponke',sex='none')
18 # test3(**{'name':'ponke','age':'sando'})
19 def test4(name, age=18, *args, **kwargs):
20     print(name)
21     print(age)
22     print(args)
23     print(kwargs)
24     logger('zhangsan')
25 
26 
27 def logger(source):
28     print("%s in test4" % source)
29 
30 
31 test4('ponker91',28, *[11,'愛好', 123, 111, 'lll'], **{'大約': 12, 'xiaoyu': 'jghg'})
View Code

3.返回值  

要想獲取函數的執行結果,就能夠用return語句把結果返回

注意:

  1. 函數在執行過程當中只要遇到return語句,就會中止執行並返回結果,so 也能夠理解爲 return 語句表明着函數的結束
  2. 若是未在函數中指定return,那這個函數的返回值爲None

4. 遞歸

在函數內部,能夠調用其餘函數。若是一個函數在內部調用自身自己,這個函數就是遞歸函數

遞歸特性:

1. 必須有一個明確的結束條件

2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減小

3. 遞歸效率不高,遞歸層次過多會致使棧溢出(在計算機中,函數調用是經過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。因爲棧的大小不是無限的,因此,遞歸調用的次數過多,會致使棧溢出)

5. 匿名函數 

匿名函數就是不須要顯式的指定函數

#這段代碼
def calc(n):
    return n**n
print(calc(10))
 
#換成匿名函數
calc = lambda n:n**n
print(calc(10))
View Code

也許會說,用上這個東西沒感受有毛方便呀, 。。。。呵呵,若是是這麼用,確實沒毛線改進,不過匿名函數主要是和其它函數搭配使用的呢,以下

1 res = map(lambda x:x**2,[1,5,7,4,8])
2 for i in res:
3     print(i)
View Code

 

 

125491664

相關文章
相關標籤/搜索