python06-列表表達式、生成器表達式及其面試題、解耦簡單介紹、函數遞歸相關

来源:https://www.cnblogs.com/zrh918/archive/2019/11/18/11842298.html
-Advertisement-
Play Games

目錄: 一、列表推導式 二、生成器表達式 三、集合生成器 四、生成器面試題 五、解耦簡單介紹 六、函數遞歸相關 一、列表推導式 需求:將[1,3,5]中的每個元素平方 正常思路: 1 new_list = [] 2 for i in [1,3,5]: 3 new_list.append(i*i) 4 ...


目錄:

一、列表推導式

二、生成器表達式

三、集合生成器

四、生成器面試題

五、解耦簡單介紹

六、函數遞歸相關

一、列表推導式

需求:將[1,3,5]中的每個元素平方

正常思路:

1 new_list = []
2 for i in [1,3,5]:
3     new_list.append(i*i)
4 print(new_list)  #輸出結果:[1, 9, 25]

列表推導式:以[ ]框住裡面的內容

print([i*i for i in [1,3,5]])  #輸出結果:[1, 9, 25]

列表推導式圖示流程:

 可以看出列表推導式的作用就是簡化代碼

列表推導式例題:

1.輸出10以內能被三整除的數的平方

print([i*i for i in range(10) if i %3 == 0])  #[0, 9, 36, 81]

2.輸出列表每一個包含‘o’元素的字元串

list_case = [['one','two','three'],['four','five','six']]

正常思路:

1 list_case = [['one','two','three'],['four','five','six']]
2 for i in list_case:
3     for v in i:
4         if v.count('o')>0:
5             print(v)

列表推導式:

list_case = [['one','two','three'],['four','five','six']]
print([v for i in list_case for v in i if v.count('o')>0])

二、生成器表達式:

( )框住裡面的內容,就是把列表表達式的[ ]改成( ),就是生成器表達式

例如:

1 case = ('第%d個人' %i for i in range(3))

從生成器中取值的三種方法:

生成器表達式作用:節省記憶體,簡化代碼,相比較列表表達式多了一個節省記憶體的作用,那是因為生成器具有惰性求值的特性

生成一個人生成器歸生成,我記憶體不會載入他,只有當你用的時候我才去載入他。

用戶要一個數據,生成器就給一個數據,比如前面例題的range(3),列表表達式就是一下子生成3個,生成器表達式就是你要一個我生成一個。

三、集合生成器:

{  }框住裡面的內容,自帶去重功能

lis_case = [-1,1,2,3]
print({i*i for i in lis_case})  #輸出結果{1, 4, 9}

在以後工作中,列表推導式最常用,但是儘量把列表推導式變成生成器推導式,因為這樣節省記憶體,節省記憶體的思想應該處處體現在代碼里,這樣才能體現水平。

四、生成器表達式面試題:

有如下代碼:問輸出的結果是什麼? 

1 def demo():
2     for i in range(4):
3         yield i
4 g=demo()
5 g1=(i for i in g)
6 g2=(i for i in g1)
7 print(list(g1))
8 print(list(g2))

答案:

[0, 1, 2, 3]
[]

考點:

記憶體載入第5行和第6行的時候是不會載入裡面的內容的,然後第7行調用g1的時候記憶體才會去載入g1的內容

g1本質上是一個生成器推導式,只能用一次,所以第7行print一次之後,g1就是空列表了

生成器練習題:問輸出結果是啥?

1 def add(n,i):
2     return n+i
3 def test():
4     for i in range(4):
5         yield i
6 g=test()
7 for n in [1,10,5]:
8     g=(add(n,i) for i in g)
9 print(list(g))

上面的代碼可以這樣理解:

 1 # def add(n,i):
 2 #     return n+i
 3 # def test():
 4 #     for i in range(4):
 5 #         yield i
 6 # g=test()
 7 # n = 1:
 8 #     g=(add(n,i) for i in g)
 9 # n = 10:
10 #     g=(add(n,i) for i in (add(n,i) for i in g))
11 # n = 5:
12 #     g=(add(n,i) for i in (add(n,i) for i in (add(n,i) for i in g)))
13 # print(list(g))

 代碼解釋:

7~12行代碼還是會運行,但只是計算 g=什麼 ,並不會計算=後面的具體內容,只有後面真正調用g的時候,即(list(g)),這個時候才會回去執行g=後面的內容。

五、解耦簡單介紹:

先看一個需求:

寫函數,將“從前有座山,山裡有個廟,廟裡有個老和尚講故事,講的什麼呀?”列印10遍

一般寫法:

def func_case():
    for i in range(10):print('從前有座山,山裡有個廟,廟裡有個老和尚講故事,講的什麼呀?')
func_case()

解耦思想寫法:

1 def func_case():
2     print('從前有座山,山裡有個廟,廟裡有個老和尚講故事,講的什麼呀?')
3 for i in range(10):
4     func_case()

這樣寫的好處就可以在不動第一個函數的情況下,修改列印的次數,一般寫法中如果要修改列印次數是直接修改的是函數內部的內容,這樣會影響代碼質量。

解耦的定義:

要完成一個完整的功能,但這個功能的規模要儘量小,並且和這個功能無關的其他代碼應該和這個函數分離

解耦的作用:

1.增強代碼的重用性

2.減少代碼變更的相互影響

六、函數遞歸:

遞歸:一個函數在內部調用自己就叫做遞歸,遞歸在函數內部分為遞推、回歸兩個流程,python解釋器規定遞歸層數是有限制的(一般為997層),寫遞歸函數時必須要有一個結束條件

例如需求:1的年齡比2大兩歲,2的年齡比3大兩歲,3的年齡比4大兩歲,4的年齡是40歲,用函數方式計算1的年齡。

這個需求就是典型的遞歸問題,下麵是代碼示例:

1 def age(n):
2     if n == 4 :
3         return 40
4     return age(n+1)+2
5 ret = age(1)
6 print(ret)

代碼解釋:

遞歸實例:

用戶輸入數字n,求n的階乘:

1 n = int(input(">>>:"))
2 def func(n):
3     if n == 1:return 1
4     return n*func(n-1)
5 print(func(n))

斐波那契:

1 n = int(input(">>>:"))
2 def fib(n):
3     if n == 1 or n == 2:return 1
4     return fib(n-1)+fib(n-2)
5 print(fib(n))

二分法查找索引位置:(需要背過)

 1 def search(num,l,start=None,end=None):
 2     start = start if start else 0
 3     end = end if end else len(l) - 1
 4     mid = (end - start)//2 + start
 5     if start > end:
 6         return None
 7     elif l[mid] > num :   #17,17
 8         return search(num,l,start,mid-1)
 9     elif l[mid] < num:
10         return search(num,l,mid+1,end)
11     elif l[mid] == num:
12         return mid
13 l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
14 print(search(66,l))

三級菜單:

menu = {
    '北京': {
        '海澱': {
            '五道口': {
                'soho': {},
                '網易': {},
                'google': {}
            },
            '中關村': {
                '愛奇藝': {},
                '汽車之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龍觀': {},
        },
        '朝陽': {},
        '東城': {},
    },
    '上海': {
        '閔行': {
            "人民廣場": {
                '炸雞店': {}
            }
        },
        '閘北': {
            '火車戰': {
                '攜程': {}
            }
        },
        '浦東': {},
    },
    '山東': {},
}
menu內容
 1 def Three_Level_Menu(menu):
 2     while True:
 3         for k in menu:print(k)
 4         key = input('>>>(輸入q退出,輸入b返回上一層):')
 5         if key == 'q':return 'q'
 6         elif key == 'b':break
 7         elif key in menu:
 8             ret = Three_Level_Menu(menu[key])
 9             if ret == 'q': return 'q'
10 Three_Level_Menu(menu)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...展開&收集運算符,也就是說他可以乾兩件事情,展開和收集 一:收集,顧名思義把散列東西收集到一個地方,這個地方ES6規定收集在數組中 例如:下麵函數fn將傳遞的參數收集在arg變數中,列印arg是一個數組,裡面包含著傳來的參數。就像吃豆子一樣把值收到自己的嘴裡。 function fn(...a ...
  • 設計模式--觀察者模式 1、觀察者模式 觀察者模式:定義對象間一種一對多的依賴關係,當一個對象狀態發生變化時,所有依賴於它的對象都得到通知,並被自動更新。 2、觀察者模式的結構 角色 主題(Subject):主題是一個介面,該介面規定了具體主題需要實現的方法,比如添加,刪除觀察者以及通知觀察者的方法 ...
  • 裝飾器模式--裝飾模式 1、裝飾模式 裝飾模式:動態的給對象添加一些額外的職責,例如,給相片加各種不同的相框(相框就是裝飾器)。 2、裝飾模式的結構 角色 抽象組件(Component): 抽象組件定義了需要進行裝飾的方法,也就是“被裝飾者”角色; 具體組件(ConcreteComponent): ...
  • 系統分析師 軟體水平考試(高級) 開篇 前言 時隔一年,我開始了系統分析師的博客寫作。回過頭翻看一下,一年前的系統架構設計師系列的第一篇博客 需求理論,還是比較有感觸的。 其實系統分析師的考試早在上邊年五月份就參與了,也在六月份就知道自己通過了考試。但是一方面系統分析師與系統架構設計師有很多內容上的 ...
  • 一、安裝Redis集群 安裝步驟參照網上教程,Mac安裝步驟參照https://github.com/muyl/mac docker redis cluster 二、創建SpringBoot工程 1. 創建Redis配置類 2. SpringBoot屬性文件 3. SpringBoot啟動類 4. ...
  • 後補 ...
  • 1、Java代碼監控 JDK提供java.lang.management包, 其實就是基於JMX技術規範,提供一套完整的MBean,動態獲取JVM的運行時數據,達到監控JVM性能的目的。 代碼地址 "https://github.com/AganRun/Learn/tree/master/Java/ ...
  •  很幸運參與零售雲快消平臺的公有雲搭建及孵化項目。零售雲快消平臺源於零售雲家電3C平臺私有項目,是與公司業務強耦合的。為了適用於全場景全品類平臺,集團要求項目平臺化,我們搶先並承擔了此任務。並由我來主要負責平臺建設及項目落地。  今天講解在零售雲快消平臺中使用的圖片服務FastD ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...