計算機基礎第二周作業 作業整理函數知識點:(大部分筆記都在電腦的印象筆記裏面) 這次總結的粗了一點
一. 字符編碼
核心:以什麽編碼寫的存入硬盤,就以什麽編碼取出
1.1 內存使用的是unicode編碼,全是兩個字節提高傳輸速度..一般都是使用utf-8的萬國編碼,優點是節省空間.缺點是運行速度相對較慢
1.2 數據最先產生在內存中的 是unicode格式,想要傳輸就要轉化成二進制的bytes格式
1 #unicode----->encode(utf-8)------>bytes 2 拿到bytes,就可以往文件內存放或者基於網絡傳輸 3 #bytes------>decode(gbk)------->unicode
1.3 文件-gbk/utf-8=文件.encode(‘gbk/utf-8‘) 這是指定文件編碼類型 或者轉換 編碼.encode將文件編碼成某種類型
文件-gbk/utf-8=文件.decode(‘gbk/utf-8‘) 這是指定文件編碼類型 或者轉換 解碼.decode 將文件解碼成某種類型
1.4 了解 python3裏面默認是utf-8來編寫和讀取文件 utf-8是Unicode萬國編碼的轉變形式
二.文件處理
2.1 關鍵詞 和with 語法
open --打開文件 encoding=‘utf-8‘--打開文件的編碼格式 close--關閉文件夾 read--讀取文件內容 readline()--逐行讀取 (print自帶換行符) end=‘ ‘可以去除 readlines---每一行都讀進來
with open as read_f with語法可以打開多個文件
2.1.1
文件句柄 = open(‘文件路徑‘, ‘模式‘)
打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄,日後通過此文件句柄對該文件操作。
2.2
上下文管理 with
with open (‘aaa.py‘,‘r‘,encoding=‘utf-8‘) as read_f, open(‘aaa_new.py‘,‘w‘,encoding=‘utf-8‘)as writ_f: date=read_f.read() write_f.wriet(data)
2.3文件打開模式
f=open(‘r‘)=只讀模式 f=open(‘r+‘)=讀寫模式(光標在文件末尾)文件不存在就會報錯
f=open(‘w‘)=只寫模式,文件不存在創建新的文件,文件存在則清空(不能讀只能寫)
f=open(‘w+‘)=創建文件讀寫 想當於w模式加了r的模式
f=open(‘a‘)=只追加寫模式,文件不存在 則報錯,文件存在會在末尾追加
f=open(‘a+‘)=在文件末尾讀寫 直接添加內容到文件尾部
2.4文件內容的修改
for line in f:
print(line,end="") 文件再大 同時只取一行內容
總結性代碼 那不了解就抄5遍 上下文管理 with open(‘aaaa.py‘,‘r‘,encoding=‘utf-8‘) as read_f, open(‘aaaa_new.py‘,‘w‘,encoding=‘utf-8‘) as write_f: data=read_f.read() write_f.write(data) 循環取文件每一行內容 with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as f: while True: line=f.readline() if not line:break print(line,end=‘‘) lines=f.readlines() #只適用於小文件 print(lines) data=f.read() print(type(data)) for line in f: #推薦使用 print(line,end=‘‘) 文件的修改 方式一:只適用於小文件 import os with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as read_f, open(‘a.txt.swap‘,‘w‘,encoding=‘utf-8‘) as write_f: data=read_f.read() write_f.write(data.replace(‘alex_SB‘,‘alex_BSB‘)) os.remove(‘a.txt‘) os.rename(‘a.txt.swap‘,‘a.txt‘) 方式二: import os with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as read_f, open(‘a.txt.swap‘,‘w‘,encoding=‘utf-8‘) as write_f: for line in read_f: write_f.write(line.replace(‘alex_BSB‘,‘BB_alex_SB‘)) os.remove(‘a.txt‘) os.rename(‘a.txt.swap‘,‘a.txt‘)
三.函數 參數 和返回值
3.1為什麽要有函數? 減少帶碼冗余,增強代碼可讀性
函數分類? 內置函數的自定義函數 自定義函數以def開頭
函數的調用? 調用函數以函數的名稱加()來調用
3.2返回值可以返回一個值和多個值 和任意類型的值 return就是返回需要的那個值 定義完函數之後在末尾添加
作用就是結束整個函數的運行
看代碼 def ret_demo1(): ‘‘‘返回多個值‘‘‘ return 1,2,3,4 def ret_demo2(): ‘‘‘返回多個任意類型的值‘‘‘ return 1,[‘a‘,‘b‘],3,4 ret1 = ret_demo1() print(ret1) ret2 = ret_demo2() print(ret2)
3.3參數
參數分為形參和實參
3.3.1形參就是def後面 跟的參數 分為位置參數 默認參數 和動態參數
位置參數必須傳值
默認參數可以不傳值
默認參數 不懂寫5遍 腦子笨最好的辦法 def stu_info(name,sex = "male"): """打印學生信息函數,由於班中大部分學生都是男生, 所以設置默認參數sex的默認值為‘male‘ """ print(name,sex) stu_info(‘alex‘) stu_info(‘eva‘,‘female‘)
動態參數分為兩種 *args 分解元組 **kwargs分解字典 以下看代碼
老規矩 不懂就是抄就抄 def fun2(*args): print(args) t=(1,2,3,4) fun2(*t) **kwarg def stu_info(**kwargs): print(kwargs) print(kwargs[‘name‘],kwargs[‘sex‘]) stu_info(name = ‘alex‘,sex = ‘male‘)
3.4 實參 :就是實即要傳入的參數==傳參
也是分為兩種方式 位置傳參和關鍵字傳參 看代碼
位置參數 老規矩 def mymax(x,y): #此時x=10,y=20 the_max = x if x > y else y return the_max ma = mymax(10,20) print(ma) 關鍵字傳參 def mymax(x,y): #此時x = 20,y = 10 print(x,y) the_max = x if x > y else y return the_max ma = mymax(y = 10,x = 20) print(ma)
補充幾點
函數的嵌套 和 函數名
函數的嵌套就是為了保護 內部函數在外部調用(其實自己沒明白這句話什麽意思...等文科130的解釋一下吧)
函數嵌套 7月28日 def animal(): def tiger(): print(‘bark‘) print(‘eat‘) tiger() animal() #函數嵌套使用 def f1(): print(a) #無法獲取f2的a的值,註意執行順序 print(‘f1‘) def f2(): a = 10 f1() f2()
函數名的本質就是內存地址 下面的代碼借用他人的
#!/usr/bin/env python #_*_coding:utf-8_*_ def func(): print(‘func‘) print(func) #函數func內存地址 f = func #就是函數的內存地址 print(f) #函數func內存地址 f() #執行代碼 ############# l = [f] #還是函數內存地址 print(l) l[0] == f #用索引取值 l[0]() #可以用作函數的參數 def func(): print(‘func‘) def func2(f): print(f) #func的內存地址 f() #執行func函數 print(‘func2‘) func2(func) #可以作為函數的返回值 def func(): print(‘func‘) def func2(f): #1 接收func函數的內存地址 print(‘func2‘) return f #2 返回給fu函數func函數的內存地址 fu = func2(func) fu() #3 執行函數func #如果我想在全局使用內部的函數
四.作用域 閉包 局部變量和全局變量
4.1 作用域的定義和作用
分為內置函數空間..在哪裏都可以用
全局函數空間..他不能用局部的但是局部的可以用他的
局部函數空間(自定義函數) 在自己定義的空間內可以用 (註意一點就是 它只在調用的時候加載)
爺爺 爸爸 兒子 =內置 全局 局部 就是這個作用域最好的解釋!!!
全局作用域:全局命名空間、內置命名空間
局部作用域:局部命名空間
站在全局看:
使用名字:name=123
如果全局有:用全局的
如果全局沒有:用內置的(這個內置是python自帶的函數)
為什麽要有作用域的概念:
為了函數內的變量不會影響到全局
不懂就抄 #全局命名空間 a = 5 b = 8 #局部命名空間(函數) def my_max(): c = a if a > b else b return c m = my_max() print(m)
作用域在定義函數時就已經固定住了,不會隨著調用位置的改變而改變
白話就是:定義一個函數可以使用的範圍
作用:作用域:(老師總結的 太詳細了 )
1.小範圍的可以用大範圍的
2.但是大範圍的不能用小範圍的
3.範圍從大到小
4.在小範圍內,如果要用一個變量,是當前這個小範圍有的,就用自己的
5.如果在小範圍內沒有,就用上一級的,上一級沒有就用上上一級的,以此類推。
6.如果都沒有,報錯
4.2閉包閉包閉包閉包閉包閉包閉包閉包閉包閉包閉包閉包閉包閉包閉包閉包
4.2.1閉包函數的定義和解釋
內部函數,包含了對外部作用域中變量的引用
閉包
1.閉 內部的函數
2.包 包含了對外部函數作用域中變量的引用
3.內部函數調用全局的變量和return一個返回值
4.函數名可以當做函數的參數
5.閉包函數多用於裝飾器中(自己目前的理解)
#閉包的常用形式 def hei(): x = 20 def inner(): print(x) #局部的 return inner
如果在一個內部函數裏:inner()就是這個內部函數,
對在外部作用域(但不是在全局作用域)的變量進行引用:x就是被引用的變量,x在外部作用域hei()裏面,但不在全局作用域裏。
則這個內部函數inner()就是一個閉包。
五.裝飾器(各種裝飾器/帶參數的裝飾器)和語法糖(重點..聽了兩天懵懵懂懂)
總結之前寫點自己的理解
裝飾器=用之前先寫好模板放在那裏 然後一句一句的寫原函數 最後想辦法把兩者加起來
5.1裝飾器是什麽?
裝飾器也是一個函數
字面意思:就是裝飾某件東西讓其變得高雅.....其實就是裝飾閉包函數
真是意思:為其他函數加上其他新功能
5.2裝飾器原則和方式
原則:對擴展是開放的 對修改是封閉的,在不改變原代碼和原函數的調用方式的情況下給原函數加上新的功能
裝飾器必須放到被裝飾的函數上邊,並且獨占一行;多個裝飾器下 ,按照先下後上執行。
5.3裝飾固定代碼(想辦法記住 最賤的辦法就是抄 印到腦子裏 10遍)
代碼不懂就敲 一言不合就5遍 def timer(func): def inner(*args,**kwargs): ‘‘‘執行函數之前要做的‘‘‘ re = func(*args,**kwargs) ‘‘‘執行函數之後要做的‘‘‘ return re return inner 2.默寫代碼 import time def timer(func): def inner(*args,**kwargs): start = time.time() re = func(*args,**kwargs) print(time.time() - start) return re return inner @timer #==> func2 = timer(func2) def func2(a): print(‘in func2 and get a:%s‘%(a)) return ‘fun2 over‘
計算機基礎第二周作業 作業整理函數知識點:(大部分筆記都在電腦的印象筆記裏面) 這次總結的粗了一點