目錄 自定義函數 內置函數 文件的操作 練習題 一. 自定義函數 1. 函數的創建 2. 函數的參數 (1)參數的定義 參數是使用通用變數來建立函數和變數之間關係的一個變數。我們都知道函數是用來被調用的,當我們需要給這個函數傳送值的時候,參數用來接收調用者傳遞過來的數據,並保存下來作為一個變數以便後 ...
目錄
- 自定義函數
- 內置函數
- 文件的操作
- 練習題
一. 自定義函數
1. 函數的創建
函數的創建 1.def關鍵字 2.函數名+() 3.冒號 4.縮進 5. return返回值,可以不寫,預設的返回值為None 例: def hanshuming(): print(123) print(456) return True hanshuming()
2. 函數的參數
(1)參數的定義
參數是使用通用變數來建立函數和變數之間關係的一個變數。我們都知道函數是用來被調用的,當我們需要給這個函數傳送值的時候,參數用來接收調用者傳遞過來的數據,並保存下來作為一個變數以便後期使用。
(2)參數的分類
<1>.實參: 指的是用戶在調用函數的時候傳遞給函數的值。
<2>.形參: 指的是在函數名後面括弧中寫入的參數,用來接收用戶的實際參數的。
例:
# a 指的是形參,用來接收用戶的實參 # lsjeg 是實參,用來傳遞給形參 def test(a): print(a) test('lsjeg')
<3>.指定參數: 指的是傳遞的參數。
<4>.預設參數: 指的是函數名後面括弧內跟的參數,當沒有實參傳入的時候,預設是這個值。
例:由結果可知,當傳遞的有實參的時候,將用實參,這就是指定參數,當沒有實參傳入的時候,就用預設值“中國”,這就是預設參數。
def test(a='中國'): print(a) test(123) test() 結果: 123 中國
<5>.動態參數: 指的是加*號的參數。為什麼會有動態參數呢?其實就是python把所有的實參迴圈的放在一個元組裡面而已。
<6>.普通參數: 指的是沒有加*的函數,他可以接受任意的實參。
例:一個星號的動態參數
# a是普通參數 # *args是動態參數,把接收的所有參數都保存在一個元組中 # 動態參數必須放在普通參數後面 # 要註意的是Python他會自動的把第一個形參傳遞a,然後後面的都會傳遞給動態參數。 def test(a,*args): print(args) test(123,'sl','s2','s3')
例:兩個星號的動態參數(主要為了存儲字典)
註意他的結果,【11,22,33】前面有*,所以會把裡面的元素依次的放入元組中,
# a是普通參數 # *args是動態參數,把接收的所有參數都保存在一個元組中 # **kwargs也是動態參數,把接收的所有參數保存在一個字典中,註意,實參必須是鍵值對 # 一個*的必須在後面,兩個*的必須在一個*的後面 def test(a,*args,**kwargs): print(args) print(kwargs) test(123,*[11,22,33],sle=23) 結果: (11, 22, 33) {'sle': 23}
3. 變數
<1>.全局變數:簡單來說就是沒有在函數中定義的變數。一般用大寫表示
<2>.局部變數: 相反,就是在函數中定義的變數。一般小寫
例1:
# 預設函數裡面是沒有辦法修改全局變數的 TEST = 123 def test(a): TEST = 456 test(1) print(TEST) 結果: 123
例2:修改全局變數
TEST = 123 def test(a): global TEST TEST = 456 test(1) print(TEST) 結果: 456
4. lambda表達式
什麼是lambda表達式呢,其實就是對自定義函數的一個簡化,當然,他也是只能用於簡單的函數創建。
例:
# 定義了兩個函數,兩個函數的功能是一樣的 # 一般方式定義test # lambda表達式定義的lambda_test def test(a1, a2): return a1+a2 lambda_test = lambda a1,a2: a1+a2 print(test(1,2)) print(lambda_test(1,2))
5. 三元表達式
三元表達式是什麼東西呢,其實就是對if...else迴圈的一個簡化,但是只能用於簡單的if...else的簡化,在很多的語言中都有。
例:if前面的為條件成立後執行的語句,else後面的為條件不成立時執行的語句
# 普通的判斷語句 a = 1 if a < 6: name = 'huwentao' else: name = 'zhouyan' print(name) # 這個是三元表達式, name = 'zhouyan' if a < 6 else 'huwentao' print(name) 輸出結果: huwentao zhouyan
二. 內置函數簡介
1. str(), int(), bool(), list(), dict(), set(), tuple(), bytes(), type(), isinstance() 這個是一系列的關於數據類型的函數,因為對於數據類型創建一般有兩種方式, 例: <1>: i = 10 <2>: i = int(10) 這兩種方式是一樣的,其本質都是調用int函數的_init_函數去創建的對象,其他的類型也一樣 type(): type() 可以顯示出類型 例: i = 10 print(type(i)) 結果:<class 'int'> isinstance(要判斷的數據, 數據類型): 用來判斷是不是某個類型 例: i = 10 print(isinstance(i, int)) 結果: True 因為i就是int類型。所以返回True 2. bin(), int(), hex(), oct() 這是一系列關於進位轉換的函數, bin(): 十進位轉二進位 例:print(bin(10)) ----->0b1010 hex(): 十進位轉十六進位 例:print(hex(10)) ----->0xa oct(): 十進位轉八進位 例:print(oct(10)) ----->0o12 int(): 其他進位轉十進位 例: print(int('10101', 2)) #二進位---》十進位 print(int('ab', 16)) #二進位---》十進位 print(int('10', 8)) #二進位---》十進位 結果: 21 171 8 3. repr(), ascii() 這兩個函數差不多是一樣的,就是調用內置函數裡面的_repr__() 4. all(), any() all(): 裡面的變數全部為真,返回值為真 例: print(all(['hu','zhou','xiaozhou'])) print(all(['hu','zhou','xiaozhou',''])) 結果: True False any(): 裡面的變數只要有一個為真,就返回為真 例: print(any([])) print(any(['hu','zhou','xiaozhou'])) print(any(['hu','zhou','xiaozhou',''])) 結果: False True True 5. dir(), help() 用來獲得當前模塊或者函數的屬性列表 dir() 獲取簡單的屬性列表 print(dir(list)) help() 獲取詳細的屬性列表 help(list) 6. enumrate() ,len() 會給一個序列在生成一列索引,由以下例子可以看出,自動增加縮進然後以一個元組的形式保存在i變數中 例: list = ['hu','zhou','xiaozhou'] for i in enumerate(list, 1): print(i) 結果: (1, 'hu') (2, 'zhou') (3, 'xiaozhou') len(): 得到長度 7. max(), min(), sum(), sorted(), round(), reversed(), abs(), pow(), range(), divmod(), zip() 這個是一系列關於數據操作的函數 由名字可以看出,取最大值,最下值,求和,排序,四捨五入,翻轉,取絕對值,求冪運算,生成一個可迭代對象 round(): 例: print(round(11.1)) print(round(11.5)) print(round(11.6)) 結果: 11 12 12 reversed(): 例: list = [99,32,1,232,44] print(sorted(list)) range():生成一個可迭代對象 例: a = range(10) print(a) for i in a: print(i, end = ' ') 結果: range(0, 10) 0 1 2 3 4 5 6 7 8 9 divmod(): 把除數和餘數同時輸出來 例: print(divmod(10, 3)) -----》 (3, 1) zip(): 結合兩個列表 list = [11,22,33,44] hu = ['hu','zhou','xiaohu','xiaozhou'] a = zip(list, hu) for i in a: print(i) 8. callable() 判斷裡面的數據是否可執行,一般函數和類是可執行的 例: def test(): return 10 print(callable(1)) print(callable('weg')) print(callable(test)) 結果: False False True 9. chr(), ofd() chr(): 數字轉ascii ord(): asscii轉數字 例: print(chr(69)) print(ord('E')) 10. compile(),exec(),eval() complie():用來編譯生成對象 exec(): 用來執行編譯生成的對象 例: str = ''' for i in range(4): print(i) ''' c = compile(str,'','exec') exec(c) eval():只能對簡單的代碼進行操作,不能進行代碼的執行 例: print(eval('1+2')) 11. local() globals(), hash() local():當前執行函數的所有局部變數 globals:當前執行函數的所有全局變數 hash(): 對裡面的數據進行hash運算 12. exit() exit(): 退出程式 13. open(), import open是打開文件 import導入模塊 14. filter(), map() filter(函數,過濾的對象): 每一個過濾的對象都相應的執行函數,當返回為真的時候,就返回回去,並且返回的是一個對象 例: def hanshu(aa): if aa > 22: return True else: return False a = filter(hanshu, [11,22,33,44]) print(a) for i in a: print(i) 結果: <filter object at 0x000000A1636B4470> 33 44 map(函數,對象):每一個過濾的對象都響應的代入函數中執行,返回的是他的返回值,而且返回的是一個對象 例: def hanshu(aa): if aa > 22: return True else: return False a = map(hanshu, [11,22,33,44]) print(a) for i in a: print(i) 結果: <map object at 0x0000005B2B504470> False False True True
三. 文件的操作
1. 文件的操作
文件的基本操作有打開,和關閉,讀寫等。
# 一般在打開一個文件的時候會創建一個對象傳遞給一個變數f # parameter1:文件名,如果是相對路徑,必須在一個目錄下麵 # parameter2:模式, 大致分為兩種r,w # parameter3:編碼方式 f = open('parameter1','parameter2','parameter3') f.close()
2. 文件的模式
(1)普通的讀寫
<1>. r: 只能讀,傳入的文件參數必須要存在,否則會報錯
# test在當前目錄下一定要存在 # flie.write不能用,只能讀 file = open('test','r') data = file.read() # file.write('lwjege') file.close()
<2>. w: 只能寫,不能讀,傳入的文件如果存在,就清空裡面的內容,如果不存在,就創建
# 當傳入的參數是w的時候,執行完此代碼再去查看test文件的時候,會發現裡面的內容為“大中國”,無論之前的內容是什麼,都是這個內容,因為寫操作不是追加的,而是先清空之前的內容然後在寫入。 file = open('test','w') file.write('大中國') file.close()
<3>. x: 只能寫,不能讀,傳入的文件不能存在,存在就報錯
# 這裡的參數test2在此目錄下麵不能存在,如果存在就會報錯,而且不能讀數據 file = open('test2','x') # file.read() file.write('大中國') file.close()
<4>. a: 只能寫,不能讀,傳入的文件存在,就追加寫入,如果不存在,就創建
# 當傳入的參數是a的時候,不能讀數據,只能進行寫數據,而且他是追加寫入,不像w,會把之前的數據都清空 file = open('test','w') file.write('大中國') file.close()
(2)可讀可寫
以下的操作其實很大程度上是繼承了上面普通操作的屬性,只是加上+號的都是可讀可寫的,其餘的都基本上一樣。
<1>. r+: 可讀可寫,文件必須存在,不存在就報錯,而且他不是覆蓋存儲的,也不是清空之後存儲的。由以下例子可見,r+是從前往後覆蓋存儲的。
例1:寫入文件
file = open('test','r+',encoding='utf-8') print(file.tell()) file.write('我是中國人,我驕傲.') file.close()
查看文件內容:
我是中國人,我驕傲.
例2:再次寫入文件
file = open('test','r+',encoding='utf-8') print(file.tell()) file.write('woshi') file.close() 顯示文件文內容: woshi�中國人,我驕傲.
例3:有讀操作
# 只要是讀操作執行了,在寫的時候就會預設的在後面追加 with open('test','r+',encoding='utf-8') as f: print(f.tell()) f.read(1) f.write('xxx')
原文件內容:123456
執行完上述操作的內容:123456xxx
例4: 有讀操作,也有seek
# 如果在寫操作前面加上seek指定地址,寫操作就會再這個地址後面添加內容,覆蓋後面的內容 with open('test','r+',encoding='utf-8') as f: print(f.tell()) f.read(1) f.seek(2) print(f.tell()) f.write('xxx') 源文件內容:123456789 執行完代碼的內容:12xxx6789
<2>. w+: 可讀可寫,文件不存在可以創建,存在就清空再存儲
file = open('test','w+',encoding='utf-8') print(file.tell()) file.write('woshidab') file.close() 顯示內容: woshidab
<3>. x+: 依然是文件不能存在,存在就報錯,可讀可寫。
file = open('test6','x+',encoding='utf-8') print(file.tell()) # file.write('woshidab') file.close()
<4>. a+: 可讀可寫,文件存在就追加存儲,文件不存在就創建。
file = open('test7','a+',encoding='utf-8') print(file.tell()) file.write('woshidab') file.close()
(3)位元組方式的存儲
r 和不加r的區別主要在於一個 是python內部自動給我們轉換成了字元串的格式,一個是沒有轉換的直接就是位元組格式。
例:
# 此例可知道,加上b之後的的操作都是bytes,而不加b就是字元 file = open('test','r') data = file.read() print(type(data)) file.close() file = open('test','rb') data = file.read() print(type(data)) file.close() 顯示結果: <class 'str'> <class 'bytes'>
原理:
<1>. rb: 和r的屬性都一樣,只是輸出的是位元組而已,我們把他轉換一下就可以了。
# 輸出的那一句做了位元組到字元串的轉換,編碼方式需要看test本身的編碼方式是什麼 file = open('test','rb') data = file.read() print(str(data,encoding='utf-8')) file.close()
<2>. wb: 和w的屬性都一樣,只是輸出的是位元組而已,我們把他轉換一下就可以了。
# 讀和寫的編碼方式要一樣 file = open('test','wb') file.write(bytes('我是中國人',encoding='utf-8')) file.close() file = open('test','rb') print(str(file.read(),encoding='utf-8')) file.close() 輸出結果: 我是中國人
<3>. xb: 和x的屬性都一樣,只是輸出的是位元組而已,我們把他轉換一下就可以了。
<4>. ab: 和a的屬性都一樣,只是輸出的是位元組而已,我們把他轉換一下就可以了。
# 因為他是追加輸入,我多運行了幾次,因此顯示如下結果 file = open('test','ab') file.write(bytes('我是中國人',encoding='utf-8')) file.close() file = open('test','rb') print(str(file.read(),encoding='utf-8')) file.close() 輸出結果: 我是中國人我是中國人我是中國人我是中國人
3. 文件類的額外功能
flush:用來刷新緩衝區的,把緩衝區的內容寫入文件中而不需要等待文件被關閉,並清除緩衝區。
readline:一次讀入一行
tell: 獲取當前指針指向的位置
seek: 調整當前指針的指向的位置
truncate:用來截斷文件,當前內容後面的都將會被刪除
write: 寫入操作
read: 讀取操作
open: 打開文件
close: 關閉文件
4. 同時打開多個文件
# 固定的格式
with open('源文件','r') as obj1,with open('新文件','w') as obj2 for line in obj1: obj2.write(line)
四. 練習題:
1. 簡述普通參數,指定參數,預設參數,動態參數的區別
2. 寫函數,計算傳入字元串中【數字】,【字母】,【空格】以及【其他】的個數
# -*- coding:GBK -*- # zhou # 2017/6/13 def function1(a): digit = 0 str = 0 space = 0 other = 0 for i in a: if i.isdigit(): digit += 1 elif i.isalpha(): str += 1 elif i.isspace(): space += 1 else: other += 1 return ({'數字':digit,'字元':str,'空格':space,'其他':other}) a = function1('234wlj**ego ewjgo') for i in a: print(i,a[i],'個') 顯示結果: 字元 11 個 空格 2 個 數字 3 個 其他 2 個
3. 寫函數,判斷用戶傳入的對象(字元串,列表,元組)長度是否大於5
# -*- coding:GBK -*- # zhou # 2017/6/13 def function(a): if len(a) <= 5: print('傳入的參數長度小於等於5') else: print('傳入的參數長度大於5') function('lwejglejgl') function([11,22,33,44]) function((1,2,3,4,5,6)) 顯示結果: 傳入的參數長度大於5 傳入的參數長度小於等於5 傳入的參數長度大於5
4. 寫函數,檢查傳入列表的長度,如果大於2,那麼僅保留前兩個長度的內容,並將其作為新列表返回給調用者
# -*- coding:GBK -*- # zhou # 2017/6/13 def function(a): if isinstance(a,list): if len(a) > 2: ret = a[0:2] else: ret = a else: ret = a return ret print(function([11,22,33,44])) print(function(['hu','zhou'])) 結果: [11, 22] ['hu', 'zhou']
5. 寫函數,判斷用戶傳入的對象(字元串,列表,元組)的每一個元素是否含有空內容
# -*- coding:GBK -*- # zhou # 2017/6/13 def function(a): for i in range(len(a)): if a[i].count(' ') != 0: print('輸入的對象中第%d元素中含有空格'%(i+1)) function(['hu','zh ou'])
6. 寫函數,檢查獲取傳入列表或元組對象的所有奇數位索引對應的元素,並將其作為新列表返回給調用者
# -*- coding:GBK -*- # zhou # 2017/6/13 def function(a): ret = [] for i in range(len(a)): if i % 2 == 1: ret.append(a[i]) return ret print(function(['hu','zhou','mage','laomanhai']))
7. 寫函數,檢查傳入字典的每一個value的長度,如果大於2,那麼僅保留前兩個長度的內容,並將其新內容返回給調用者
# -*- coding:GBK -*- # zhou # 2017/6/13 def function(a): ret = a for i in a.keys(): if len(a[i]) > 2: ret[i] = a[i][0:2] else: ret[i] = a[i] return ret print(function({'k1':'v1','hu':'haoshuai','zhou':'haomei'})) 結果: {'k1': 'v1', 'zhou': 'ha', 'hu': 'ha'}
8. 驗證碼
# -*- coding:utf-8 -*- # zhou # 2017/6/14 import random temp = str() for i in range(6): num = random.randrange(0, 4) if num == 1 or num == 3: num = random.randrange(0, 10) temp = temp + str(num) else: rad = random.randrange(65, 91) rad = chr(rad) temp = temp + rad print(temp)