Python進階教學一

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 一、函數
    • 1.高階函數
    • 2.返回函數
    • 3.匿名函數
    • 4.裝飾器
  • 二、實例
    • 1.類和實例
    • 2.限制訪問
    • 3. 繼承和多態
    • 4.實例屬性和類屬性


一、函數

1.高階函數

  • 1.1 map
  • 1.2 reduce
  • 1.3 filter
  • 1.4 sorted
# 1.1 map()函數:把一個函數作用到一個Iterable的東西上
# 參數:1.函數 2.Iterable
# 返回值類型:map object
# 舉例:把平方作用到列表的每個值中
def f(x):return x * x
r = map(f,[1,2,3,4,5,6,7,8,9])
list(r)

>>>[1, 4, 9, 16, 25, 36, 49, 64, 81]

# map()函數實際上就是不是運算規則抽象化了
# 把list的每個數字變成str
list(map(str,[1,2,3,4,5,6,7,8,9]))

>>>[‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]

# 1.2 reduce()函數:把一個函數累計作用到序列的下一個元素中
# reduce(f,[x1,x2,x3]) == f(f(x1,x2),x3)
# 舉例,把[1,2,3]變成123
from functools import reduce
def fn(x,y):return x*10+y
reduce(fn,[1,2,3])

>>> 123

# 1.3 filter函數:接收函數和序列,根據函數作用在序列的每個元素返回的True和False決定是否保留該元素
# 返回類型:Iterator
# 舉例:只保留序列中的奇數
def is_odd(n):return n%2==1
list(filter(is_odd,[1,3,5,7,2,4,6,8]))

>>>[1, 3, 5, 7]

# 把一個序列中的空字符去掉
def not_empty(s):return s.strip()
list(filter(not_empty, ['A', '', 'B', 'C', '  ']))

>>>[‘A’, ‘B’, ‘C’]

# sorted對list進行排序
sorted([32,12,-19,55,3])

>>>[-19, 3, 12, 32, 55]

# 參數:key,接收自定義排序函數
# 舉例:按照絕對值大小排序
sorted([32,12,-19,55,3],key=abs)

>>>[3, 12, -19, 32, 55]

# 對于字符 是按照ASCII碼進行排序
sorted(['sb','Sb','SB'])

>>>[‘SB’, ‘Sb’, ‘sb’]

2.返回函數

  • 2.1 函數作為返回值
  • 2.2 閉包
# 2.1 高階函數出了可以接收函數作為參數,還可以把函數作為結果返回
# 一個可變參數的求和,如果不需要立刻求和,而是在后面的代碼中,根據需要再計算
def lazy_sum(*args):def sum():ax = 0for n in args:ax = ax + nreturn axreturn sum
# 調用的時候返回的是求和函數
f = lazy_sum(1,2,3,4)
f>>> <function __main__.lazy_sum.<locals>.sum()># 調用函數f的時候,才是返回真正的求和結果
f()

>>>10

# 在函數lazy_sum里面又定義了函數sum,內部函數可以引用外部函數的參數和局部變量
# lazy_sum返回了sum的時候,相關的參數和變量都保存在了返回函數中,就是閉包
# 每一次調用 返回的都是新的函數 但是傳入的是相同的參數
f1 = lazy_sum(1,2,3,4)
f2 = lazy_sum(1,2,3,4)
f1 == f2

>>>False

# 2.2 閉包
# 要注意返回的函數沒有立刻執行,要再一次的調用才會執行
def count():fs = []for i in range(1,4):def f():return i * ifs.append(f)return fs
count()
f1,f2,f3 = count()
print(f1(),f2(),f3())
# 因為返回函數引用了i,并且并非立刻執行,3個函數都返回時,所以它引用的變量i已經變成3

>>>9 9 9

# 如果一定要引用循環的變量,就應該再創建一個函數,綁定循環變量
def count():def f(j):def g():return j*jreturn gfs = []for i in range(1,4):fs.append(f(i))return fs
count()
f1,f2,f3 = count()
print(f1(),f2(),f3())

>>>1 4 9

3.匿名函數

list(map(lambda x: x*x,[1,2,3]))

>>>[1, 4, 9]

# 相當于
def f(x):return x * x

4.裝飾器

# 函數也是對象,所以可以賦值給變量,通過變量來調用函數
def now():print('2020-01-01')
f = now
f()

>>>2020-01-01

# 想要增強now()的功能,在調用的前打印日志,有不改變函數本身的定義,這樣動態增加功能的方法叫做裝飾器
# 本質上是一個返回函數的高階函數
def log(func):def wrapper(*args,**kw):print('call %s:'%func.__name__)return func(*args,**kw)return wrapper
# %%
@log
def now(x):print('2020-01-01')
now(1)
# %%

>>>


call now:


2020-01-01

# @log 放在now函數之前 相當于
now = log(now)
# decorator也要傳入參數,需要編寫一個decorator的高階函數
def log(text):def decorator(func):def wrapper(*args,**kw):print('%s %s:'%(text,func.__name__))return func(*args,**kw)return wrapperreturn decorator
# %%
@log('execute')
def now():print('2020-01-01')
# %%
now()

>>>


execute now:


2020-01-01

# 相當于
now = log('execute')(now)
# 先執行了log('execute'),返回了decorator函數,再調用返回函數,參數是now,返回的是wrapper
# 也就是原來的now函數變成了現在的wrapper函數了
now.__name__

>>>‘wrapper’

# 想要保持now的name的話 wrapper.__name__ = func.__name__
# 可以用裝飾器 @functools.wraps(func)
import functools
def log(func):@functools.wraps(func)def wrapper(*args,**kw):print('call %s():' % func.__name__)return func(*args,**kw)return wrapper# %%
@log
def now():print('2020-01-01')
# %%
now.__name__

>>>‘now’

二、實例

1.類和實例

  • 1.1 基本定義
  • 1.2 創建實例
  • 1.3 綁定屬性
  • 1.4 _init_
  • 1.5 數據封裝
# 1.1 基本定義
#  class + 類名 + (object) 即從哪個類繼承下來的
class student(object):pass
# 1.2 創建實例
# 類名+()
bart = student()
# 變量bart指向student類的實例,0x1064b1128是內存地址
bart
student

>>>


<main.student at 0x1064b1128>


main.student

# 1.3 綁定屬性
# 可以自由的給實例變量綁定屬性
bart.name = 'sb'
bart.name

>>>‘sb’

# 1.4 __init__
# 類就像是模版 當我們想創建實例的時候就把一些屬性寫進去 可以用__init
class student(object):# self 就是實例本身def __init__(self,name,score):self.name = nameself.score = scorebart = student('sb',0)
bart.name
bart.score

>>> ‘sb’ 0

# 1.5 數據封裝
# 比如一個函數本來就要用到學生類里面的數據,那當然就把函數放在類里面多好嘛
class student(object):def __init__(self,name,score):self.name = nameself.score = scoredef print_score(self):print('%s:%s'%(self.name,self.score))bart = student('sb',0)
bart.print_score()

>>>sb:0

2.限制訪問

# 按照上述的定義,外部代碼還可以自由修改實例的屬性
bart.score
bart.score = 100
bart.score

>>>


0


100

# 我們更希望這些屬性是私有的,不能被外部代碼修改的
class student(object):def __init__(self,name,score):self.__name = nameself.__score = scoredef print_score(self):print('%s: %s' % (self.__name, self.__score))bart = student('sb',0)
bart.__name
>>>
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-24-1e120ece361e> in <module>
----> 1 bart.__nameAttributeError: 'student' object has no attribute '__name'
# 這么做又有一個問題,雖然外部代碼不能修改實例的屬性了。但是我們還是希望外部代碼可以獲得他的值
class student(object):def __init__(self,name,score):self.__name = nameself.__score = score# 讓外部可以獲得屬性的值def get_name(self):return self.__namedef get_score(self):return self.__score# 讓外部可以改變屬性的值def set_name(self,name):self.__name = name# 可以通過這樣改變屬性的方法來做參數檢查,避免傳入無效參數def set_score(self,score):if 0 <= score < 100:self.__score = scoreelse:raise ValueError('bad score')bart = student('sb',0)
bart.get_name()
bart.set_name('SB')
bart.get_name()

>>>


‘sb’


‘SB’

bart.set_score(50)
bart.get_score()
>>>50bart.set_score(250)
>>>
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-40-6cf87971f6eb> in <module>
----> 1 bart.set_score(250)<ipython-input-31-e38b3fe7e472> in set_score(self, score)20             self.__score = score21         else:
---> 22             raise ValueError('bad score')ValueError: bad score

3. 繼承和多態

  • 3.1 繼承
  • 3.2 子類的特性
  • 3.3 理解多態
# 現在我們已經有一個動物class,一個run()方法打印
class Animal(object):def run(self):print("Animal is running...")
# 3.1 繼承
# 當我們需要具體的動物類時,可以從Animal繼承
class cat(Animal):passclass Dog(Animal):pass
# 繼承最大的好處就是子類有了父類的全部功能
dog = Dog()
dog.run()

>>>Animal is running…

# 3.2 子類的特性
# 子類可以增加新的方法也可以對父類的方法進行改進
class Dog(Animal):# 改進父類方法def run(self):print('Dog is running...')# 新的方法def eat(self):print('Dog is eating...')dog = Dog()
dog.run()
dog.eat()

>>>


Dog is running…


Dog is eating…

# 3.3 理解多態
# 定義一個class,實際上就是定義了一種數據類型
a = list() # a是list類型
b = Animal() # b是Animal類型
c = Dog() # c是Dog類型
# c既是Dog也是Animal
# 就是說Dog可以看成是一個Animal
isinstance(c,Animal)
isinstance(c,Dog)

>>>


True


True

# 理解多態的好處
class Animal(object):def run(self):print("Animal is running...")def eat(self):print('Anumal is eating...')class Dog(Animal):def run(self):print('Dog is running...')def eat(self):print('Dog is eating...')def run_eat(a):a.run()a.eat()
run_eat(Animal())

>>>


Animal is running…


Anumal is eating…

run_eat(Dog())
# 多態的好處:傳入的只要是Animal或者他的子類,就會自動調用實際類型的run()
# 調用的時候只管調用,新加一個子類的時候只要保證他繼承的方法沒寫錯
# 開閉原則:
# 對擴展開放:允許增加子類
# 對修改封閉:不需要修改類的run_eat()函數

>>>


Dog is running…


Dog is eating…

  • 靜態語言:利用多態特性的時候,傳入的對象必須嚴格的是Animal類或者他的子類
  • 動態語言:不要求嚴格的繼承體系
    • 鴨子類型:一個對象只要看起來像鴨子,走路也像鴨子,就能被看作是鴨子
    • python:“file-like object”就是一種鴨子類型,某個對象有當前的這個函數方法,就可以當作是這個函數的對象了。

4.實例屬性和類屬性

# 給實例綁定屬性
# 1.通過實例變量 2.通過self變量
class student(object):def __init__(self,name):self.name = names = student('sb')
s.score = 0
# 直接給類綁定一個類屬性
class student(object):name = 'student'# 創建實例
s = student()
# 這個時候實例沒有name,所以會向上找類的name
s.name

>>>‘student’

# 打印類的屬性
print(student.name)
>>>student# 給實例綁定屬性
s.name = 'sb'
print(s.name)
>>>sbprint(student.name)
>>>student

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

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

相關文章

Dsco Dropship EDI需求分析

供應商要想從Dsco處通過EDI獲取訂單&#xff0c;需要部署自己的EDI系統&#xff0c;與Dsco的EDI供應商CommerceHub 建立連接&#xff0c;分為兩個方向&#xff1a; 1.從CommerceHub 的 Dsco 平臺獲取 EDI 850 采購訂單 2.向Dsco發送庫存&#xff08;846&#xff09;、訂單狀態…

MySQL的內外連接

1.內連接 內連接實際上就是利用 WHERE 子句&#xff08;連接條件&#xff09;對兩張表形成的笛卡爾積&#xff08;內連接&#xff09;進行篩選&#xff0c;我們之前學習的查詢基本都是內連接&#xff0c;也是在實際生產中被使用得最多的連接查詢。 另外內連接還可以使用下面的…

Java Swing游戲開發學習7

內容來自RyiSnow視頻講解 這一節實現的是背景音樂和音效的播放。 在這里&#xff0c;背景音樂和音效所用的音頻文件均為wav格式文件。Java SDK默認支持的格式有限&#xff0c;默認不支持mp3格式音樂。 背景音樂、拾取鑰匙、拾取靴子、開門分別有對應的音頻文件。 作者的實現…

2024-02學習筆記

1.當我們向Set集合中添加一個已經存在的元素時 當我們向Set集合中添加一個已經存在的元素時&#xff0c;Set集合會如何處理呢&#xff1f;實際上&#xff0c;Set集合不會將重復的元素添加到集合中。當我們向Set集合中添加一個元素時&#xff0c;Set集合會首先判斷該元素是否已…

Ubuntu-22.04安裝MegaCLI并查看MegaRAID的配置

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、MegaRAID二、安裝MegaCLI1.Ubuntu-18.042.Ubuntu-22.043.Ubuntu-20.044.CentOS-75.其它發行版 三、使用MegaCLI1.查看所有適配器信息2.查看所有物理磁盤信息…

華為配置WLAN高密業務示例

配置WLAN高密業務示例 組網圖形 圖1 配置高密WLAN環境網絡部署組網圖 業務需求組網需求數據規劃配置思路配置注意事項操作步驟配置文件 業務需求 體育場由于需要接入用戶數量很大&#xff0c;AP間部署距離較小&#xff0c;因此AP間的干擾較大&#xff0c;可能導致用戶上網網…

新王炸:文生視頻Sora模型發布,能否引爆AI芯片熱潮

前言 前方高能預警&#xff0c;Sora來襲&#xff01; 淺析Sora的技術亮點 語言模型中構建關鍵詞聯系 視頻素材分解為時空碎片 擴散模型DiT Not for play, But change world! OpenAI的宏大目標 未來已來&#xff0c;只是尚未流行 Sora的成本與OpenAI的7萬億美金豪賭 算…

【探索AI】人人都在講AIGC,什么是AIGC?

AIGC 概述示例展示我們日常用到的一些工具/應用核心技術介紹核心技術的算法解析案例及部分代碼實現1. 藝術作品2. 設計項目3. 影視特效4. 廣告創意總結 一張圖先了解下&#xff1a; 概述 "人工智能生成創造&#xff08;Artificial Intelligence Generated Content&#x…

從CPU緩存結構到原子操作

一、CPU緩存結構 1.1 CPU的多級緩存 因為CPU的計算速度非常快&#xff0c;但內存的訪問速度相對較慢。因此&#xff0c;如果CPU每次都要從內存讀取數據&#xff0c;會造成大量的等待時間&#xff0c;降低整體性能。 通過引入多級緩存&#xff0c;可以在CPU和內存之間建立數據…

vue3中實現elementPlus表格選中行的上移下移

先看效果&#xff1a; 實現步驟&#xff1a; 1、給el-table添加current-change事件、高亮屬性及ref屬性 2、給上移下移按鈕添加事件 // 定義當前選中的行參數 const currentRow ref<any>(null); // 定義表格的ref const singleTableRef ref(); // 行選中事件 const ha…

正信晟錦:借了錢的人一直不接電話不回信息咋辦

在金錢往來中&#xff0c;遇到借出的錢款無法按時回收&#xff0c;且借款人如同人間蒸發一般不接電話、不回信息&#xff0c;確實讓人焦慮。面對這種情形&#xff0c;我們需采取明智而有效的措施&#xff0c;以保護自身的權益。 首要策略是保持冷靜&#xff0c;不要讓情緒主導行…

四、《任務列表案例》后端程序實現和測試

本章概要 準備工作功能實現前后聯調 4.1 準備工作 數據庫腳本 CREATE TABLE schedule (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255) NOT NULL,completed BOOLEAN NOT NULL,PRIMARY KEY (id) );INSERT INTO schedule (title, completed) VALUES(學習java, true),(學…

【前端素材】推薦優質在線高端蜂蜜商城電商網頁Beejar平臺模板(附源碼)

一、需求分析 1、系統定義 在線高端蜂蜜商城是指一個專門銷售高品質、高端蜂蜜產品的電子商務平臺。這種商城致力于向消費者提供各種經過精心挑選、具有高營養價值和健康功效的蜂蜜產品。 2、功能需求 在線高端蜂蜜商城是指一個專門銷售高品質、高端蜂蜜產品的電子商務平臺…

Go字符串實戰操作大全!

目錄 1. 引言文章結構概覽 2. Go字符串基礎字符串的定義與特性什么是字符串&#xff1f;Go字符串的不可變性原則 字符串的數據結構Go字符串的內部表達byte和rune的簡介 3. 字符串操作與應用3.1 操作與應用字符串連接字符串切片字符串查找字符串比較字符串的替換字符串的大小寫轉…

vos3000外呼系統警告消除怎么設置

你有沒有發現vos3000登陸時老是提示告警&#xff0c;消除一會又出現&#xff0c;那么又什么辦法能解決呢&#xff1f;要徹底消除 VOS3000 系統的警告&#xff0c;一般需要通過以下步驟來進行排查和解決&#xff1a; 確認警告信息&#xff1a;首先要明確警告的具體內容和出現的條…

舊的Spring Security OAuth已停止維護,全面擁抱最新解決方案Spring SAS

Spring Authorization Server 替換 Shiro 指引 背景 Spring 團隊正式宣布 Spring Security OAuth 停止維護&#xff0c;該項目將不會再進行任何的迭代 目前 Spring 生態中的 OAuth2 授權服務器是 Spring Authorization Server 已經可以正式生產使用作為 SpringBoot 3.0 的最新…

c++異常機制(3) -- 異常類型和生命周期

目錄 拋出的異常類型大致可以分為三種。 第一種 基本類型 1. 可以直接拋出常量 2. 也可以拋出定義好的變量 3. 如果我們使用const&#xff0c;會不會影響到異常的匹配。 第二種 字符串類型以及指針類型 1. 使用字符指針 注意: 2. 使用string類型 第三種 …

計算機專業大學生的簡歷,為何會出現在垃圾桶

為什么校招過后垃圾桶里全是簡歷&#xff0c;計算機專業的學生找工作有多難&#xff1f; 空哥這么跟你說吧&#xff0c;趁現在還來得及&#xff0c;這些事情你一定要聽好了。 第一&#xff0c;計算機專業在學校學的東西是非常有限的&#xff0c;985211的還好&#xff0c;如果…

GPS歷史軌跡優化算法的研究與實現

GPS歷史軌跡優化算法的研究與實現 摘要 本研究提出了一種綜合利用數據清洗、密度聚類、卡爾曼濾波和地圖匹配的新算法,命名為“DSKF-Match”。該算法旨在處理GPS軌跡數據,通過清洗、聚類、平滑和匹配等步驟,提高數據的質量和準確性。首先,算法利用時間窗口法進行數據清洗…

D365:LookUp

文章目錄 前言一、復制onLookUp事件方法二、LookUp方法 前言 在Form的字段的onLookUp方法中&#xff0c;添加下拉框。 一、復制onLookUp事件方法 二、LookUp方法 [FormControlEventHandler(formControlStr(EcoResProductDetailsExtended, VyaKeyItemType_VyaMaterialSubCode…