python函數(6):內置函數和匿名函數

来源:http://www.cnblogs.com/liluning/archive/2017/08/03/7280832.html
-Advertisement-
Play Games

我們學了這麼多關於函數的知識基本都是自己定義自己使用,那麼我們之前用的一些函數並不是我們自己定義的比如說print(),len(),type()等等,它們是哪來的呢? ...


我們學了這麼多關於函數的知識基本都是自己定義自己使用,那麼我們之前用的一些函數並不是我們自己定義的比如說print(),len(),type()等等,它們是哪來的呢?

 預習:

1、用map來處理字元串列表,把列表中所有人都變成sb,比方alex_sb
name=['alex','wupeiqi','yuanhao','nezha']
2、用filter函數處理數字列表,將列表中所有的偶數篩選出來
num = [1,3,5,6,7,8]
3、隨意寫一個20行以上的文件,運行程式,先將內容讀到記憶體中,用列表存儲。 接收用戶輸入頁碼,每頁5條,僅輸出當頁的內容
4、如下,每個小字典的name對應股票名字,shares對應多少股,price對應股票的價格
portfolio = [
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}
]
1.計算購買每支股票的總價
2.用filter過濾出,單價大於100的股票有哪些
預習題

 

一、內置函數

由python內部定義好我們可以直接調用的函數就叫內部函數。python一共給我們68個內置函數:

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都是做進位換算的,但是卻被寫在了三個地方。。。這樣非常不利於大家歸納和學習。那我把這些函數分成了7大類。有助於大家總結和記憶。

內置函數思維導圖:

 

思維導圖詳細地址:https://www.processon.com/view/link/598042afe4b03afe8264824f

密碼:91K8

其中在七個分類中有詳細分類。中標註紅色為必須掌握,黃色為重點掌握,其他的作為瞭解。


 

二、內置函數部分詳解

1、作用域相關(locals,globals)

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

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

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

def func():
    x = 1
    y = 2
    print(locals())  #列印局部作用域中的名字
    print(globals()) #列印全局作用域中的名字
View Code

2、其他

s = input("請輸入內容 : ")  #輸入的內容賦值給s變數
print(s)  #輸入什麼列印什麼。數據類型是str
input輸入
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: 立即把內容輸出到流文件,不作緩存
    """
print輸出源碼剖析
import time
import sys
for i in range(0,101,2):
    time.sleep(0.1)
    char_num = i//2      #列印多少個#
    per_str = '%s%% : %s\n' % (i, '*' * char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num)
    print(per_str,end='', file=sys.stdout, flush=True)
進度條(瞭解)

3、數據類型相關

num = 123
num1 = [1,2,3]
num2 = "hello"
type(num,num1,num2) #返回變數的數據類型
type

4、記憶體相關

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函數會根據一個內部的演算法對當前可hash變數進行處理,返回一個int數字。

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

5、文件操作相關 

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

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

可以用encoding指定編碼

open()
r,w,a,r+,w+,a+,(都可以+b)
f = open('tmp','r+')
print(f.read(3))
f.seek(5)
f.write('ccccccc')
#不要一邊寫一邊讀
f.close()

r+打開文件
如果直接寫 從頭覆蓋
如果讀了再寫 追加
如果seek指定了游標的位置 就在從該位置開始覆蓋著寫
open

6、模塊操作相關

import time #導入time模塊

7、幫助方法

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

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

8、和調用相關

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

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

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

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

10、str類型代碼的執行

print(123)
"print(456)"  #字元串
eval("print(456)")  #字元串->轉換成python代碼去執行

exec("print(789)")

num = 1+2+3
num = eval("1+2+3")  #執行
print(num)

num2 = exec("4+5+6") #執行,沒有返回值
print(num2)
View Code

11、和數字相關

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

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

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

#絕對值
print(abs(-12))

#返回(除,餘)
print(divmod(7,4))

#最小值 最大值
print(min(1,2,3,4))
print(max(1,2,3,4))

#求和
print(sum((1,2,3,4)))  #print(sum(1,2,3,4))這個報錯因為不是序列
print(sum([1,2,3,4]))
print(sum((1,2,3,4)))

#小數精確
print(round(3.14159,1))
print(round(3.14159,2))
print(round(3.14159,3))

#冥運算
print(pow(2,4))
print(2**4)
數學運算

12、和數據結構相關

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

#位置
print(format('test', '<20'))
print(format('test', '>40'))
print(format('test', '^40'))

#字元編碼的轉換
s = "你好"
sb = bytes(s,encoding='utf-8')
print(sb)
ret = sb.decode('utf-8')
print(ret)

#格式化輸出
print(repr('1234'))
print(repr(1234))
字元串相關

序列:reversed,slice

#倒敘
l = [1,2,3,4]
print(list(reversed(l)))
reversed

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

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

#直接改變原列表
l = [1,3,5,-2,-4,-6]
l.sort()
print(l)

#生成新列表 原列表不變
l2 = [1,3,5,-2,-4,-6]
print(sorted(l2,key=abs,reverse=True))
print(sorted(l2))
print(l2)

#為每次取值加序號
l = ['a','b']
for i,j in enumerate(l,1):
    print(i,j)

#all判斷全有 any判斷有
print(all([1,2,3]))
print(all([0,2,3]))
print(any([0,1,0]))
print(any([0,0,0]))

#配對
l = [1,2,3]      #3
l2 = {'k':'v'}  #1
print(zip(l,l2))
print(list(zip(l,l2)))

#返回奇數
def is_odd(x):
    return x % 2 == 1
filter(is_odd, [1, 4, 6, 7, 9, 12, 17])

#返回平方
L = [1,2,3,4,]
def pow2(x):
    return x*x
map(pow2,L)
#之前用過很多次就不再細說
數據集合

 

三、匿名函數

匿名函數 簡單的需要用函數去解決的問題 匿名函數的函數體 只有一行

也叫lambda表達式

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

#函數名 = lambda 參數 :返回值

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

小練習:

l = [10,11,8,12]
# def func(x):
#     return x>10
# print(list(filter(func,l)))
print(list(filter(lambda x:x>10,l)))

l = [1,2,3,4]
# def pow2(x):
#     return x*x
# map(pow2,l)
print(list(map(lambda x:x*x , l)))

dic={'k1':10,'k2':100,'k3':30}
print(max(dic))
func = lambda k:dic[k]
print(max(dic,key = func))
print(max(dic,key = lambda k:dic[k]))
匿名函數練習

 

預習答案:

#1、題
name=['alex','wupeiqi','yuanhao','nezha']
def sb(str) :
    return str + "_sb"

print(list(map(sb,name)))

#2題
num = [1,3,5,6,7,8]
def even(num) :
    return num % 2 == 0

l = list(filter(even,num))
print(l)

#4題
for i in range(0,len(portfolio)) :
    print(portfolio[i]["name"],portfolio[i]["shares"]*portfolio[i]["price"])

def unit_p(str) :
    return str["price"] > 100
print(list(filter(unit_p,portfolio)))
1、2、4題
def read_page(bk_list,n,endline=None):
    startline = 5 * (n-1)
    endline = endline+startline-1 if endline else startline + 4
    # print(startline,endline)
    for i in range(startline,endline+1):
        print(bk_list[i],end = '')

def read_book(filename):
    f = open(filename)
    book_list = f.readlines()
    f.close()
    return book_list

book_list = read_book('aaa')
line_num = len(book_list)

x,y = divmod(line_num,5)
print(line_num,x,y)
if y:
    page = x+1
else:
    page = x
page = x+1 if y else x
print('一共有%s頁'%page)
while True:
    page_num = input('請輸入您要閱讀的頁碼 : ').strip()
    if page_num.isdigit():
        page_num = int(page_num)
        if page_num < page:
            read_page(book_list,page_num)
        elif page_num == page:
            read_page(book_list,page_num,y)
        else:
            print('您輸入的內容有誤')
3題

 


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

-Advertisement-
Play Games
更多相關文章
  • 系統自動拋出的異常 所有系統定義的編譯和運行異常都可以由系統自動拋出,稱為標準異常,並且 Java 強烈地要求應用程式進行完整的異常處理,給用戶友好的提示,或者修正後使程式繼續執行。 語句拋出的異常 用戶程式自定義的異常和應用程式特定的異常,必須藉助於 throws 和 throw 語句來定義拋出異 ...
  • package java.util; public interface Enumeration<E> { boolean hasMoreElements(); E nextElement(); } public interface Iterator<E> { boolean hasNext(); E ...
  • 內部類的分類:常規內部類、靜態內部類、私有內部類、局部內部類、匿名內部類。 實例1:常規內部類 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //外部類 class Out { private int age = 12; ...
  • 一、首先說一下JDK中的動態代理: JDK中的動態代理是通過反射類Proxy以及InvocationHandler回調介面實現的 但是,JDK中所要進行動態代理的類必須要實現一個介面,也就是說只能對該類所實現介面中定義的方法進行代理,這在實際編程中具有一定的局限性,而且使用反射的效率也並不是很高。 ...
  • 在JDK的Collection中我們時常會看到類似於這樣的話: 例如,ArrayList: 註意,迭代器的快速失敗行為無法得到保證,因為一般來說,不可能對是否出現不同步併發修改做出任何硬性保證。快速失敗迭代器會盡最大努力拋出 ConcurrentModificationException。因此,為提 ...
  • 一、源碼解析 1、 LinkedList類定義。 LinkedList 是一個繼承於AbstractSequentialList的雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。LinkedList 實現 List 介面,能對它進行隊列操作。LinkedList 實現 Deque 介面,即能將 ...
  • 1、快速排序的基本思想: 快速排序使用分治的思想,通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之後分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。 2、快速排序的三個步驟: (1)選擇基準:在待排序列中,按照某種方式挑出一個元素,作為 "基準"(p ...
  • 解釋:找資料庫中的最近新增的賬號 以上的方法,都比較的好用和方便。其實這些我都要百度,是同事寫的,真強! ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...