Python—內置函數和匿名函數

来源:https://www.cnblogs.com/Golanguage/archive/2020/02/15/12315373.html
-Advertisement-
Play Games

楔子 在講新知識之前,我們先來複習複習函數的基礎知識。 問:函數怎麼調用? 函數名() 如果你們這麼說。。。那你們就對了!好了記住這個事兒別給忘記了,咱們繼續談下一話題。。。 來你們在自己的環境里列印一下自己的名字。 你們是怎麼打的呀? 是不是print('xxx'),好了,現在你們結合我剛剛說的函 ...


楔子

在講新知識之前,我們先來複習複習函數的基礎知識。

問:函數怎麼調用?

函數名()

如果你們這麼說。。。那你們就對了!好了記住這個事兒別給忘記了,咱們繼續談下一話題。。。

來你們在自己的環境里列印一下自己的名字。

你們是怎麼打的呀?

是不是print('xxx'),好了,現在你們結合我剛剛說的函數的調用方法,你有沒有什麼發現?

我們就猜,print有沒有可能是一個函數?

但是沒有人實現它啊。。。它怎麼就能用了呢?

早在我們“初識函數”的時候是不是就是用len()引出的?

那現在我們也知道len()也是一個函數,也沒人實現,它好像就自己能用了。。。

之前老師給你講你可以這樣用你就用了,那你有沒有想過像這樣直接拿來就能用的函數到底有多少?

內置函數

接下來,我們就一起來看看python里的內置函數。截止到python版本3.6.2,現在python一共為我們提供了68個內置函數。它們就是python提供給你直接可以拿來使用的所有函數。這些函數有些我們已經用過了,有些我們還沒用到過,還有一些是被封印了,必須等我們學了新知識才能解開封印的。那今天我們就一起來認識一下python的內置函數。這麼多函數,我們該從何學起呢?

  Built-in Functions  
abs() dict() help() min() setattr()
all() dir() hex() next() slice()
any() divmod() id() object() sorted()
ascii() enumerate() input() oct() staticmethod()
bin() eval() int() open() str()
bool() exec() isinstance() ord() sum()
bytearray() filter() issubclass() pow() super()
bytes() float() iter() print() tuple()
callable() format() len() property() type()
chr() frozenset() list() range() vars()
classmethod() getattr() locals() repr() zip()
compile() globals() map() reversed() __import__()
complex() hasattr() max() round()  
delattr() hash() memoryview() set()  

上面就是內置函數的表,68個函數都在這兒了。這個表的順序是按照首字母的排列順序來的,你會發現都混亂的堆在一起。比如,oct和bin和hex都是做進位換算的,但是卻被寫在了三個地方。。。這樣非常不利於大家歸納和學習。那我把這些函數分成了6大類。你看下麵這張圖,你猜咱們今天會學哪幾大類呀? 

我猜你們都猜對了。我們今天就要學慣用粉紅色標註出來的這四大塊——56個方法。還有12個方法欠著怎麼辦呢?我們講完面向對象這剩下的12個會在兩周之內陸續還給你們的,我保證(認真臉)。那這樣,我們今天就主要關註我們要學習的這56個方法。

那要學的一共4塊,咱們從哪兒開始學起呢?

作用域相關

基於字典的形式獲取局部變數和全局變數

globals()——獲取全局變數的字典

locals()——獲取執行本方法所在命名空間內的局部變數的字典

其他

字元串類型代碼的執行

http://www.cnblogs.com/Eva-J/articles/7266087.html

輸入輸出相關:

input() 輸入

s = input("請輸入內容 : ")  #輸入的內容賦值給s變數
print(s)  #輸入什麼列印什麼。數據類型是str

print() 輸出

# print源碼
def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
    """
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    file:  預設是輸出到屏幕,如果設置為文件句柄,輸出到文件
    sep:   列印多個值之間的分隔符,預設為空格
    end:   每一次列印的結尾,預設為換行符
    flush: 立即把內容輸出到流文件,不作緩存
    """
# file關鍵字的說明
f = open('tmp_file','w')
print(123,456,sep=',',file = f,flush=True)
# 列印進度條
import time
for i in range(0,101,2):  
     time.sleep(0.1)
     char_num = i//2      #列印多少個'*'
     per_str = '\r%s%% : %s\n' % (i, '*' * char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num)
     print(per_str,end='', flush=True)
#小越越  : \r 可以把游標移動到行首但不換行

數據類型相關

type(o) 返回變數o的數據類型

記憶體相關:

id(o) o是參數,返回一個變數的記憶體地址

hash(o) o是參數,返回一個可hash變數的哈希值,不可hash的變數被hash之後會報錯。

t = (1,2,3)
l = [1,2,3]
print(hash(t))  #可hash
print(hash(l))  #會報錯

'''
結果:
TypeError: unhashable type: 'list'
'''

hash函數會根據一個內部的演算法對當前可hash變數進行處理,返回一個int數字。

*每一次執行程式,內容相同的變數hash值在這一次執行過程中不會發生改變。

 

文件操作相關

open()  打開一個文件,返回一個文件操作符(文件句柄)

操作文件的模式有r,w,a,r+,w+,a+ 共6種,每一種方式都可以用二進位的形式操作(rb,wb,ab,rb+,wb+,ab+)

可以用encoding指定編碼.

 

模塊操作相關

__import__導入一個模塊  

import time
os = __import__('os')
print(os.path.abspath('.'))

幫助方法

在控制台執行help()進入幫助模式。可以隨意輸入變數或者變數的類型。輸入q退出

或者直接執行help(o),o是參數,查看和變數o有關的操作。。。

和調用相關

callable(o),o是參數,看這個變數是不是可調用。

如果o是一個函數名,就會返回True

def func():pass
print(callable(func))  #參數是函數名,可調用,返回True
print(callable(123))   #參數是數字,不可調用,返回False

查看參數所屬類型的所有內置方法

dir() 預設查看全局空間內的屬性,也接受一個參數,查看這個參數內的方法或變數

print(dir(list))  #查看列表的內置方法
print(dir(int))  #查看整數的內置方法

和數字相關

數字——數據類型相關:bool,int,float,complex

數字——進位轉換相關:bin,oct,hex

數字——數學運算:abs,divmod,min,max,sum,round,pow

和數據結構相關

序列——列表和元組相關的:list和tuple

序列——字元串相關的:str,format,bytes,bytearry,memoryview,ord,chr,ascii,repr

ret = bytearray('alex',encoding='utf-8')
print(id(ret))
print(ret[0])
ret[0] = 65
print(ret)
print(id(ret))
ret = memoryview(bytes('你好',encoding='utf-8'))
print(len(ret))
print(bytes(ret[:3]).decode('utf-8'))
print(bytes(ret[3:]).decode('utf-8'))

序列:reversed,slice

l = (1,2,23,213,5612,342,43)
print(l)
print(list(reversed(l)))
l = (1,2,23,213,5612,342,43)
sli = slice(1,5,2)
print(l[sli])

數據集合——字典和集合:dict,set,frozenset

數據集合:len,sorted,enumerate,all,any,zip,filter,map

filter和map:http://www.cnblogs.com/Eva-J/articles/7266192.html

sorted方法:http://www.cnblogs.com/Eva-J/articles/7265992.html

匿名函數

匿名函數:為瞭解決那些功能很簡單的需求而設計的一句話函數

#這段代碼
def calc(n):
    return n**n
print(calc(10))
 
#換成匿名函數
calc = lambda n:n**n
print(calc(10))

上面是我們對calc這個匿名函數的分析,下麵給出了一個關於匿名函數格式的說明

函數名 = lambda 參數 :返回值

#參數可以有多個,用逗號隔開
#匿名函數不管邏輯多複雜,只能寫一行,且邏輯執行結束後的內容就是返回值
#返回值和正常的函數一樣可以是任意數據類型

我們可以看出,匿名函數並不是真的不能有名字。

匿名函數的調用和正常的調用也沒有什麼分別。 就是 函數名(參數) 就可以了~~~

練一練:

請把以下函數變成匿名函數
def add(x,y):
    return x+y

 

上面是匿名函數的函數用法。除此之外,匿名函數也不是浪得虛名,它真的可以匿名。在和其他功能函數合作的時候

l=[3,2,100,999,213,1111,31121,333]
print(max(l))

dic={'k1':10,'k2':100,'k3':30}


print(max(dic))
print(dic[max(dic,key=lambda k:dic[k])])
res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)

輸出
1
25
49
16
64
res = filter(lambda x:x>10,[5,8,11,9,15])
for i in res:
    print(i)

輸出
11
15

面試題練一練

現有兩個元組(('a'),('b')),(('c'),('d')),請使用python中匿名函數生成列表[{'a':'c'},{'b':'d'}]

#答案一
test = lambda t1,t2 :[{i:j} for i,j in zip(t1,t2)]
print(test(t1,t2))
#答案二
print(list(map(lambda t:{t[0]:t[1]},zip(t1,t2))))
#還可以這樣寫
print([{i:j} for i,j in zip(t1,t2)])
答案
1.下麵程式的輸出結果是:
d = lambda p:p*2
t = lambda p:p*3
x = 2
x = d(x)
x = t(x)
x = d(x)
print x

2.現有兩元組(('a'),('b')),(('c'),('d')),請使用python中匿名函數生成列表[{'a':'c'},{'b':'d'}]

3.以下代碼的輸出是什麼?請給出答案並解釋。
def multipliers():
    return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
請修改multipliers的定義來產生期望的結果。
練習

本章小結

說學習內置函數,不如說整理自己的知識體系。其實整理這些內置函數的過程也是在整理自己的知識體系。

我們講課的時候會歸類:常用或者不常用,主要還是根據場景而言。

一個優秀的程式員就應該是在該用這個方法的時候信手拈來,把每一個內置的函數都用的恰到好處。

要想做到這一點,至少要先瞭解,才能在需要的時候想起,進而將它用在該用的地方。

但是在這裡,我還是以自己的一點經驗之談,把幾個平時工作中相對更常用的方法推薦一下,請務必重點掌握:

其他:input,print,type,hash,open,import,dir

str類型代碼執行:eval,exec

數字:bool,int,float,abs,divmod,min,max,sum,round,pow

序列——列表和元組相關的:list和tuple

序列——字元串相關的:str,bytes,repr

序列:reversed,slice

數據集合——字典和集合:dict,set,frozenset

數據集合:len,sorted,enumerate,zip,filter,map

參考文檔:

  https://docs.python.org/3/library/functions.html#object


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

-Advertisement-
Play Games
更多相關文章
  • 前言 預設的 Identity 實體類型在大多數時候已經基本夠用,很多時候也只是稍微在 IdentityUser 類中增加一些自定義數據欄位,比如頭像。這次,我要向園友隆重介紹我魔改之後的 Identity 實體類,能支持一些特別風騷的操作。當然也完全相容內置的 UserManager、RoleMa ...
  • 1、結構型設計模式 2、適配器模式 3、類適配器 4、對象適配器 ...
  • isinstance和issubclass isinstance(obj,cls)檢查是否obj是否是類 cls 的對象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) issubclass(sub, super)檢查sub類是否是 ...
  • 楔子 你現在是一家游戲公司的開發人員,現在需要你開發一款叫做<人狗大戰>的游戲,你就思考呀,人狗作戰,那至少需要2個角色,一個是人, 一個是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎麼描述這種不同的角色和他們的功能呢? 你搜羅了自己掌握的所有技能,寫出了下麵的代碼來描述這兩個角色 ...
  • 包 包是一種通過使用‘.模塊名’來組織python模塊名稱空間的方式。 1. 無論是import形式還是from...import形式,凡是在導入語句中(而不是在使用時)遇到帶點的,都要第一時間提高警覺:這是關於包才有的導入語法 2. 包是目錄級的(文件夾級),文件夾是用來組成py文件(包的本質就是 ...
  • 什麼是模塊? 常見的場景:一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的尾碼。 但其實import載入的模塊分為四個通用類別: 1 使用python編寫的代碼(.py文件) 2 已被編譯為共用庫或DLL的C或C++擴展 3 包好一組模塊的包 4 使用C編寫並鏈接到 ...
  • https://www.cnblogs.com/WUXIAOCHANG/p/10886534.html https://blog.csdn.net/pengjwhx/article/details/84867112 ...
  • 楔子 在講今天的內容之前,我們先來講一個故事,講的什麼呢?從前有座山,山裡有座廟,廟裡有個老和尚講故事,講的什麼呢?從前有座山,山裡有座廟,廟裡有個老和尚講故事,講的什麼呢?從前有座山,山裡有座廟,廟裡有個老和尚講故事,講的什麼呢?從前有座山,山裡有座廟,廟裡有個老和尚講故事,講的什麼呢...... ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...