python修煉第四天

今天換了師傅。江湖人稱景女神^o^。 女師傅講的比較細,原理的比較多。初學者來說有些難。但是基本功是必須要打牢的。努力!

迭代器

迭代器,迭代的工具
1 什么是迭代,指的是一個重復的過程,每一次重復稱為一次迭代,并且每一次重復的結果是下一次重復的初始值
while True:
print("=====")

l = ["a","b","c",]
count = 0
while count < len(l):
count +=1

2 為什么要有迭代器?
對序列類型:str list tuple可以用索引取值,
但是對非序列類型,如元祖,set 文件內容,python必須為我們提供一種不依賴于索引的迭代取值的方式--->迭代器
dic = {"name":"jack","age":18,"hobbie":"readbook"}

3 可迭代對象:
有obj.__iter__ 這個方法的對象 就是可迭代對象
可迭代對象需要有多個值 有六種
str
list
tuplt
dict
set
file
可以使用__iter__方法 看一下是否是可迭代對象
如:str.__iter__


4 迭代器對象
file 文件類型是迭代器對象,只有滿足__iter__方法,同時還要有__next__方法

總結:
1,可迭代對象不一定是迭代器對象
2,迭代器對象一定是可迭代的對象
3,調用obj.__iter__()方法,可以把可迭代對象變為迭代器對象
4,對于迭代器對象,執行__iter__方法得到的還是他本身 還是迭代器對象

變為迭代器對象后 就可以迭代取值了
d={"user":"jack","age":18,"sex":"man"}
d_iter = d.__iter__()
print(d_iter.__next__())
還可以寫成這樣:
d = {"a","b","c"}
d_iter = iter(d)
print(next(d_iter))

# for循環詳解:
1,調用in后的l_iter = l.__iter__()
2,i = l_iter.__next__()
3,捕捉StopIteration異常,結束迭代。
l = ["a","b","c"]:
for i in l :
print(i)

總結迭代器的 優缺點:
優點:1 提供一種統一的,不依賴索引的取值方法
為for循環的實現提供了依據
2 迭代器同一時間在內存中只有一個值 --->更節省內存

缺點: 1 只能往后走,并且循環一遍就結束了。
2 不能統計值得個數,即長度

def eater(name):
print("%s ready to eat"%name)
while True:
food=yield
print("%s start to eat %s" %(name,food))

這種表達式需要先初始化才能執行
1 生成迭代器
e = eater("n=jack")
2 初始化:
e.send("None")
3 傳值:
e.send("吃屎")

同時這個表達式還可以組合使用
food = yield food_list
這個food_list就是返回值。print可以得到這個值

生成器

生成器: generater
自己寫的迭代器,就是一個生成器
py提供了兩種自己寫生成器(迭代器)的機制,生成器函數,生成器表達式
1 生成器函數:
yield
凡是帶生成器關鍵字的就是生成器
生成器函數調用不會觸發代碼的執行,而是會返回一個生成器(迭代器)
想要執行需要使用過next來進行調用
def func():
print("aaaaa")
yield 1
print("bbbbbb")
yield 2
記錄當前所在位置,等待下一次next來出發函數的調用

列子:
使用生成器監聽文件輸入的列子
####### 注意這個例子需要ctrl + s 保存一下輸入的文件 才能顯示監聽文件輸入的內容
####### mac系統需要寫個python程序來往文件中輸入,才能顯示
import time
def listion_file():
with open("userinfo") as f:
while True:
line = f.readline()
if line:
yield print(line.strip()):
time.sleep(0.1)
g = listion_file
for i in g:
print(i)

關鍵字:send
定義,在執行next的過程中,傳遞一個參數給生成器函數的內部
def foo():
print(1111)
res1 = yield 1
print(22222,"res1:",res1)
res2 = yield 2
print(33333,"res2:",res2)
yield 3
g = foo()
res = next(g)
print(res)
g.send("alex")
g.send("jack")
從函數的外部向內部傳參,但是在生成器第一次中不能send傳值,需要先激活next一下。

例子
計算移動平均值:
月度的天平均收入
def argvs():
day = 0
sum_moeny = 0
while True:
moeny = yield avg
sum_moeny +=money
day +=1
avg = sum_moeny/day
g = argvs()
next(g)
g.send(200)
g.send(400)

### 預激生成器
每個生成器都需要next預激活,如果有多個生成器,就比較麻煩
可以寫個裝飾器來進行預激活,這個裝飾器就叫預激生成器


### yield from
一般寫法:
def generator_func():
for i in range():
print(i)
for o in "hello"
print(o)
可以寫成:
def generator_func():
yield from range(5)
yield from "hello"

取值的方法:
1 next(g) 隨時可以停止,最后一次會報錯

2 for i in g:
print(g) 從頭到尾遍歷一次,不遇到break return不會停止

3 list 或 tuple 吧值放入列表或元祖,但是占用內存大。
print(list(g))

注意: 生成器不能直接next(生成器函數),必須要先生成生成器 然后在next使用
錯誤的:
print(next(func()))
正確的:
g = func()
print(next(g))
生成器特點: 節省內存,惰性計算,解決內存問題,和程序功能之間的解耦

  總結:
       1,yield 為我們提供了一種自定義迭代器對象的方法
2,yield 可以返回多個值 return 只能返回一次值
3,函數暫停與在繼續的狀態是yield幫我們保存的
 

三元表達式

def my_max(x,y):
x if x > y else y
在比如
name = inpurt("請輸入您的名字:")
res = "SB" if name == "alex" else "NB"
print(res)

if右邊是條件為真時返回的值,else左邊就是為假返回的值。

列表生成器,生成器表達式

    列表推到式   數據小的時候可以使用這個。
ll = [i**2 for i in range(10)]
print(ll)
  直接把循環得到的i在for右邊進行運算,得到的全部結果賦值給ll


生成器表達式 在數據龐大的時候 建議使用生成器表達式
gg = (i for i in range(10))
for i in gg:
print(i)
總結: 1 一個生成器 只能取一次,
   2 生成器在不找他要值得時候,始終不執行
   3 當他執行的時候,要以執行時候的所有變量值為準
兩者主要區別是列表推到式用中括號括起來,生成器是用小括號括起來。

練習:
取出文件中最長行數:
with open("test.txt","r",encoding="utf-8") as f:
g = (len(line) for line in f)
print(max(x))
上面兩行可以精簡為一行
print(max(len(line) for line in f))

sum求和
print(sun(len(line) for line in f))
文件每一行的字符個數

遞歸

定義: 在調用一個函數的過程中,直接或者間接有調用該函數本身,稱之為遞歸調用
遞歸必備的兩個階段:
1.遞推
2.回朔

def func():
print("--->")
func()
func()
這個遞歸是死循環
最多就到1000層 python就不允許遞歸了
import sys
print(sys.getrecursionlimit)
sys.setrecursionlimit(2000)
這樣可以修改最大允許遞歸多少層

下面的也是遞歸調用:
def func()
print("from func")
bar()
def bar():
print("from bar")
func()
bar()


遞歸的列子 先遞推, 然后在回溯
def age(n)
if n == 1
return 18
return age(n-1) +2
res =age(5)
print(res)
這個就是n等于5 先逐層往下遞推,滿足n 等于1就返回age(1)等于18 然后回朔 age(2)等于20
最后結果就是26


遞歸列表的值
l = ["a","b","c","d","e",[1,2,3,4,["b","h","j"]]]

def func(l):
for item in l:
if type(item) is list:
func(item)
else:
print(item)


匿名函數

lambda 表達式
def add(a,b):
return a+b
可以寫為:
add = lambda a,b: a+b
print(add(1,2))
求平方的方法可以寫一行
for i in map(lambfa num : num**2,range(10)):print(i)

練習:
print(min(-2,3,-4,key=lambad num:num%2))

內置函數

內置函數
print()
len()
abs()
max()
min()
eval()
zip()
dir()
總共有68個
反射相關 2
基礎數據類型相關 38
作用域相關 2
locals 本地命名空間
globals 全局命名空間
面向對象相關 9
迭代器/生成器 3
range
next
iter
其他函數 12
inpurt
print
可以指定分隔符 sep=";" 還可以去掉結尾換行符,end="" 不是每執行一個for循環就打印,加上Flush=True 就會實時打印
其實print實際上是寫文件。需要發起系統調用才能操作文件,如果print與print之間間隔較快,print會先先緩存一下在打印出來
加上flush=True就不會等待了。
如果在字符串中加上\r 就會一直在第一行覆蓋打印 相當于seek(0)
練習題:
進度條
hash
對可hash得數據類型進行hash之后會得到一個數字
在一次執行程序的執行過程中,對相同的可hash變量,哈希之后的結果幾乎總是是不相同的。
hash 字典底層的存儲,和set集合的去重機制都相關
print(hash("123456"))
print(hash("123456"))
id
查看一個變量的內存地址
import
引用模塊
help
查看幫助信息比如這個變量怎么用,這個對象怎么用等
callable
查看是否可調用
def foo():pass
a = 1
callable(a) 返回Flose
callable(foo) 返回True
dir
查看一個變量所擁有的所有名字,不止方法。
print(dir("1"))

數據類型類:
bool

bin
轉換為二進制 0b
oct
轉換為8進制 0o
hex
轉換為16進制 0x
abs
計算數字的絕對值,只能接收數字
divmod()
商余函數
print(divmod(10,2))
print(divmod(7,3))
print(divmod(9,7))
返回一個元祖,里面有兩個值,一個是商幾后一個是余幾
round
精確到小數點幾位,精確的幾位。四舍五入
print(round(3.1415926,4))
pow
求平方, 可以放第三個參數,第三個參數就是取余
print(pow(2,3))
print(pow(3,2,2))
sum
求和 接收一個可迭代對象,后面可以寫一個起始值 默認起始值是從0開始計算。
print(sum([1,2,3,4,5],20))
可以放入一個生成器(迭代器),這樣可以節省內存。
print(sum(range(1,6)))
min
取最小值
print(ming(1,-2,3,-4,key=abs))
當兩個最小值時取第一個
max
取最大值

序列
reversed
取反 只能傳入一個序列的數據結構,新生成一個迭代器,返回值取反,同時不改變原本的數據順序
reversed(ret)
用處:可以吧元祖reversed 然后在list這個元祖 可以都得到一個反轉的元祖。
format
格式化輸出,可以居中顯示
format("text" <20) <20 ^20
bytes
字符串轉bytes
ord
print(ord("a")) 小寫的a-z從 97開始 + 26,大寫的A-Z從65+26
轉換為acsii對應的數字
chr
print(chr(97))
轉換為acsii對應的字母
ascii
字符串轉ascii碼
repr
可以讓一個數據的數據類型可以原形畢露
a = 1
b = "1"
rper(a)
rper(b)
len
統計長度
enumerate
接收一個容器類型,一般是元祖或列表,可以制定下標起始值
list1 = ["香蕉","蘋果"]
for k,v in enumerate(list1,1)
print(k,v)
all
接收容器
判斷數據類型是否存在False,如果存在就都為Flase
any
接收容器
判斷數據類型中是否存在True類型,如果存在就都為True
zip
ret = zip([1,2,3,4],("a","b","c","d"),(4,5,6,7)) #拉鏈方法
返回一個可迭代函數
for i in ret:
print(i)
filter
可以吧列表(可迭代數據類型),逐個傳入函數當作參數,進行操作。
list1 = [1,2,4,6,9,11,17]
def func(num)
if num %2 == 0:reture num
for i in filter(func,list1)
print(i)
去除空字符
ll = ['test', None, '', 'str', ' ', 'END']
def func(strs):
if strs and strs.strip():return True 如果是True就返回
for i in filter(func,ll)
print(i)
map
range(10) 求他的平方:
推到式簡單;i**2 for i in range(10)
用map
def func(num):
return num **2
for i in map(func,range(10)):print(i)
就是把函數放到map里面去執行
sorted
先說一下key: 可以指定按abs絕對值, 可以指定len 等內置函數,來根據函數返回值來進行運算
l = [1,2,-3,-4,4,5,6]
l.sort(key=abs)
print(l)
使用sorted
new_l = sorted(l,key=abs)
print(new_l)
這個有些例外,直接返回值。

執行內置函數:
eval 執行字符串中的代碼 同時有返回值,吧結果返回。 注意這個函數有安全風險! 傳入惡意程序會執行。
eval(print("123"))

exec 執行字符串中的代碼,但是沒有返回值
exec(print("123"))


注意: min max sorted filter map 面試容易問到

轉載于:https://www.cnblogs.com/liyunjie/p/8993607.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251790.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251790.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251790.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

尷尬的存儲過程

最近在給一個已沉淀了多年的系統框架進行優化&#xff0c;發現大部分的基礎業務&#xff08;比如增刪改&#xff09;的實現都是通過存儲過程來實現。這讓我糾結了很久&#xff0c;看了下代碼格式我猜應該都是使用了代碼生成器。這無疑為系統的擴展留下了一個難以彌補的大坑。 首…

java虛擬機06-內存分區/新生代、老年代

1.原因 JVM在程序運行過程當中&#xff0c;會創建大量的對象&#xff0c;這些對象&#xff0c;大部分是短周期的對象&#xff0c;小部分是長周期的對象&#xff0c;對于短周期的對象&#xff0c;需要頻繁地進行垃圾回收以保證無用對象盡早被釋放掉&#xff0c;對于長周期對象&a…

博客作業04--樹

1.學習總結(2分) 1.1樹結構思維導圖 1.2 樹結構學習體會 樹這一章節比較復雜&#xff0c;知識點繁多&#xff0c;結合了遞歸的知識所以代碼閱讀起來會有障礙&#xff0c;難以理解&#xff0c;所以學起來比較吃力&#xff0c;而且很多經典的算法理解的不是很透徹解決pta上的問題…

Centos 配置多個虛擬IP

Centos 配置多個虛擬IP 臨時設置 ifconfig enp2s0:3 192.168.3.152 netmask 255.255.255.0 up 復制代碼永久生效 TYPEEthernet BOOTPROTOnone NAMEenp2s0 DEVICEenp2s0 HWADDR40:8d:5c:bc:f4:d8 ONBOOTyes IPADDR0192.168.3.200 PREFIX024 GATEWAY0192.168.3.254 IPADDR1192.16…

[轉]MySQL日志——Undo | Redo

本文是介紹MySQL數據庫InnoDB存儲引擎重做日志漫游 00 – Undo LogUndo Log 是為了實現事務的原子性&#xff0c;在MySQL數據庫InnoDB存儲引擎中&#xff0c;還用Undo Log來實現多版本并發控制(簡稱&#xff1a;MVCC)。 - 事務的原子性(Atomicity) 事務中的所有操作&#xff0…

Vim操作指南

vim具有6種基本模式和5種派生模式。 基本模式 普通模式 插入模式 可視模式 選擇模式 命令行模式 Ex模式 派生模式 操作符等待模式 插入普通模式 插入可視模式 插入選擇模式 替換模式 1.移動光標&#xff08;普通模式下&#xff09; h&#xff1a;左 j&#xff1a;下 …

[DP/單調隊列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 購買飼料

首先我想吐槽的是題目并沒有表明數據范圍。。。 這個題目 DP方程并不難表示。 dp[i][j]表示前i個地點攜帶了j個貨物的最小花費 dp[i][j] dp[i-1][k] (j-k) * cost j*j*(leng[i]-leng[i-1]) 如果你這樣直接提交上去&#xff0c;恭喜你超時&#xff01;&#xff01;&#xff0…

十天沖刺09

今天&#xff0c;和小伙伴在做密保功能的開發&#xff0c;而且通過密保可以找回用戶密碼。轉載于:https://www.cnblogs.com/Excusezuo/p/10923690.html

hdu 6168 Numbers

zk has n numbers a1,a2,...,an. For each (i,j) satisfying 1≤i<j≤n, zk generates a new number (aiaj). These new numbers could make up a new sequence b1&#xff0c;b2,...,bn(n?1)/2 . LsF wants to make some trouble. While zk is sleeping, Lsf mixed up seq…

039_MySQL_多表查詢

#創建部門 CREATE TABLE IF NOT EXISTS dept (did int not null auto_increment PRIMARY KEY,dname VARCHAR(50) not null COMMENT 部門名稱 )ENGINEINNODB DEFAULT charset utf8;#添加部門數據 INSERT INTO dept VALUES (1, 教學部); INSERT INTO dept VALUES (2, 銷售部); IN…

sqlserver 創建對某個存儲過程執行情況的跟蹤

有時候需要抓取執行存儲過程時某個參數的值&#xff0c;有時候程序調用存儲過程執行后結果不太對&#xff0c;不確定是程序的問題還是存儲過程的問題&#xff0c;需要單獨執行存儲過程看結果 即可用下面的方法 -- --創建對某個存儲過程的執行情況的跟蹤 --注意修改路徑 和 obje…

5.7 彈性盒子

彈性盒子定義彈性盒子 display&#xff1a;flex定義子元素排列方式 flex-diection定義子元素換行方式 flxe-wrap定義子元素對齊方式橫向對齊 justify-content縱向對齊 align-items 媒體查詢 media screen and (max-width:最大寬度)and &#xff08;min-width&#xff1a;最小…

4.navicat11激活教程,親測可用哦!

原文地址&#xff1a;http://blog.csdn.net/sanbingyutuoniao123/article/details/52589678Navicat是一款數據庫管理工具, 用于簡化, 開發和管理MySQL, SQL Server, SQLite, Oracle 和 PostgreSQL 的數據庫&#xff1b;Navicat數據模型工具以圖形化方式創建關聯式數據庫&#x…

漢諾塔問題深度剖析(python實現)

當我們學習一門編程語言的時候&#xff0c;都會遇到遞歸函數這個問題。而學習遞歸的一個經典案例就是漢諾塔問題。通過這篇文章&#xff0c;觀察移動三個盤子和四個盤子的詳細過程&#xff0c;您不僅可以深刻的了解遞歸&#xff0c;也更加熟悉了漢諾塔的游戲的玩法。 更好的閱讀…

iOS-QQ臨時對話、QQ群申請跳轉

QQ 臨時對話 NSString *qq [NSString stringWithFormat:"mqq://im/chat?chat_typewpa&uin%&&version1&src_typeweb","這是是QQ號碼"];NSURL *urlQQ [NSURL URLWithString:qq];[[UIApplication sharedApplication] openURL:urlQQ]; QQ 申…

[luoguP2331] [SCOI2005]最大子矩陣(DP)

傳送門 orz不會做。。。 一個好理解的做法&#xff08;n^3*k&#xff09;&#xff1a; 分n1和n2兩種情況考慮。 n1時&#xff0c;預處理出前綴和sum[]。 設f[i][j]為到達第i格&#xff0c;已經放了j個子矩陣的最大和&#xff0c; 那么每次先把f[i][j]的值設為f[i-1][j]&#xf…

想要去阿里面試?你必須得跨過 JVM 這道坎!

概述 很多人想要到阿里巴巴、美團、京東等互聯網大公司去面試&#xff0c;但是現在互聯網大廠面試一般都必定會考核JVM相關的知識積累和實踐經驗&#xff0c;畢竟線上系統寫好代碼部署之后&#xff0c;每個工程師都必須關注JVM相關的東西&#xff0c;比如OOM、GC等問題. 所以一…

醫學知識圖譜一

大綱 知識自動提取技術 醫學知識融合 醫學知識推理 轉載于:https://www.cnblogs.com/quietwalk/p/9000950.html

在一個div里,列表樣式圖片進行float,實現水平排序

<div class"xiangce"><ul> <li><a href"#"><img src"images/pic4.gif" alt"">產品名稱</a></li><li><a href"#"><img src"images/pic4.gif" alt"…

團隊開發git使用各種問題

參考:https://www.cnblogs.com/schaepher/p/4933873.html 問題-3:保持github上項目干凈&#xff0c;對于在不同機器上運行會不同的文件不予維護(如.idea/workspace.xml) 建議:對于項目輸出在項目目錄中的文件不予維護 對于IDE自動生成且與項目所在目錄有關的文件不予維護 將這些…