Day07-函數(2)

1.函數類型

函數也是一種類型,我們自定義的函數就是函數對象,函數名保存了函數對象的引用(地址)

def test():print('我是測試函數')
?
print(test)  #函數名是變量,指向了函數對象
pf = test ?  #pf變量也指向了函數對象,所以也可以通過pf調用test函數
pf()

2. 匿名函數

不再使用def 函數名()這種形式定義函數,而是使用lambda來創建匿名函數

特點:

  • lambda只是一個表達式,函數體比def定義的函數簡單的多

  • lambda的函數體不再是代碼塊,而是一個表達式

  • lambda只有一行,運行效率很高

語法:

lambda [arg1,arg2....argn]:表達式(只能是一個表達式)
add = lambda a,b:a + b
print(add(3,5))

3.傳入函數(理解)

一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數,也可以稱之為傳入函數。可以實現通用編程,排序等復雜功能

#傳入函數,高階函數
#能被2整除數的和
def sum_even(n):sum = 0for i in range(1,n+1):if i % 2 == 0:sum += ireturn sum
?
#能被7整除的數的和
def sum_seven(n):sum = 0for i in range(1,n+1):if i % 7 == 0:sum += ireturn sum
#能被3和5整除,但不能7整除的數的和
def sum_fifteen(n):sum = 0for i in range(1,n+1):if i % 15 == 0 and i % 7 != 0:sum += ireturn sum
#通用求和函數
def sum1(n,callback):'''功能:求滿足callback規定條件的數的和:param n: 大于0的整數:param callback: 用于判斷一個數是否滿足指定條件,由調用者傳入,有一個參數,形如:def callback(n):return: 求和的結果'''sum = 0for i in range(1,n+1):if callback(i):sum += ireturn sum
print(sum1(100,lambda x:x%2==0))
print(sum1(100,lambda x:x%7==0))
print(sum1(100,lambda x:x%15==0 and x % 7 != 0))

4.閉包

我們可以在一個函數中再定義一個函數,在函數內部定義的函數稱之為內部函數,內部函數只能在函數內使用,不會污染外部空間。定義內部函數的函數稱之為外部函數,這樣的定義構成函數的嵌套

def outter(a): #外部函數x = 10def inner(y):  #內部函數print(x + y)inner(a)outter(20)
  • 內部函數只能在外部函數里調用,外界無法直接調用內部函數

在一個外部函數中定義了一個內部函數,內部函數里引用了外部函數的變量,并且外部函數的返回值是內函數的引用。這樣內部函數和其執行所需的環境變量就構成了一個閉包

一般情況下,如果一個函數結束,函數的內部所有東西都會釋放掉,局部變量都會消失。但是閉包是一種特殊情況,如果外函數在結束的時候發現有自己的局部變量將來會在內部函數中用到,就把這個局部變量綁定給了內部函數,然后自己再結束。

def outter(a): #外部函數x = adef inner(y):  #內部函數return x + y  #引用外部變量return inner  #返回內部函數(閉包)
pf = outter(20)
print(pf(10))  #30
print(pf(20))  #40

在閉包中無法直接修改外部變量x的值

def outter(a): #外部函數x = adef inner(y):  #內部函數# x += 10 ? #UnboundLocalError: local variable 'x' referenced before assignmentreturn x + yreturn inner

在python3中可以通過nonlocal關鍵字聲明一下x,表示這個變量不是局部變量,需要向上一層變量空間找這個變量。

def outter(a): #外部函數x = adef inner(y):  #內部函數nonlocal xx += 10return x + yreturn inner

5.偏函數

當一個函數有大量參數,調用的時候非常不方便,可以使用偏函數技術,將一些參數固定(給默認值),達到簡化函數調用的目的。

import functools
def test(a,b,c,d):print(a, b, c, d)
#從前面固定參數,使用位置參數就行,1=>a,2=>b
test1 = functools.partial(test,1,2)
test1(3,4)  #3=>c  4=>d
?
#從后面固定參數,需要使用關鍵字參數
test2 = functools.partial(test,c=3,d=4)
test2(1,2)  #1=>a 2=>b
?
#如果固定的參數不連續,則需使用關鍵字參數固定
test3 = functools.partial(test,b=2,d=4)
test3(a=1,c=3) #需要使用關鍵字參數,否則會報錯

6.變量的作用域

程序中的變量并不是在任意的位置都可以隨意訪問,在哪里可以訪問取決于這個變量的作用域,變量的作用域指的是變量在那段代碼中可以使用,可以使用變量的那段代碼就是變量的作用域。在python中,只有函數/類/模塊才引入作用域,if/elif/else , while/for,try/except等并不會引入新的作用域

#if語句不引入新作用域,msg在外面可以使用
if True:msg = "message"
?
print(msg)

6.1 變量作用域的分類

按照作用域劃分,可以分為:

  • L:Local,局部作用域

  • E:Enclosing,閉包作用域【閉包的外部函數中定義的變量】

  • G:Global,全局作用域 在所有函數外定義的變量

  • B:Built-in,內建作用域【內置作用域】

#1 局部作用域 ?
#局部變量只能在函數內部使用,外部無法引用
#局部變量的作用域從定義開始到函數體結束
def demo():num = 20  #局部變量 ?print(num)
demo()
#print(num) 錯誤
?
#閉包作用域
def outter():x = 10 ? #函數作用域,從定義開始到本函數結束def inner():y = x  #在閉包中可以引用print(y)return inner
pf = outter()
pf()  #執行閉包
print(pf.__closure__)
?
#全局作用域
x = 100 ?  #全局作用域  從定義開始到本文件結束
def demo():print(x)
print(x)
?
#內建作用域,是指系統內建的函數或常量,在系統載入時加載,在所有模塊中都可以直接引用
#比如說系統函數
print(max(1,2,3))  #max函數就是內建作用域  哪里都可以引用
def  demo():x = 30y = 50print(max(x, y))

6.2 變量作用域查找規則

以 L --> E --> G -->B 的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,最后到內建作用域中找。

6.3 全局變量和局部變量

定義在函數內部的變量擁有一個局部作用域,被稱為局部變量

定義在函數外面的變量擁有一個全局作用域,被稱為全局變量

局部變量和全局變量同名,局部優先

total = 0 ? #全局變量
def sum(arg1,arg2):total = arg1 + arg2 ? #局部變量print("函數內部:",total)return totalsum(10,20)
#print(total1)
print("函數外部:",total)
?
num = 1
def fun1():print(num) #UnboundLocalError: local variable 'num' referenced before assignmentnum = 123print(num)
?
fun1()

6.4 global和nonlocal

#1.在Python中,當內部作用域想修改全局變量的時候,則就要使用global關鍵字進行聲明
num = 1
def fun1():global num ? #告訴編譯器,此處的num是全局變量print(num) ? #1num = 123print(num)  #123fun1()
?
a = 10
def test():global  aa = a + 1print(a)
test()
?
#2.如果要修改函數作用域中的變量,則使用nonlocal
#需要明確的是,nonlocal關鍵字定義在閉包里面
x = 0  #全局作用域
?
def outer():x = 1 ? #閉包作用域
?def inner():nonlocal xx = 2 ? #局部作用域print("inner:",x)  #2
?inner()print("outer:",x)  #1---->2
?
outer()
print("全局:",x)  #0
?
#nonlocal關鍵字:聲明了該變量不只是在outer函數中有效,在inner函數內部也有效

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

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

相關文章

php在html里面的位置,關于script在html中的擺放位置解析

以前一直覺得script在html中的任何位置都可以,今天做一個需求的時候才更正了自己的錯誤思想啊--script的位置也不是隨便放的。本文主要談論關于script在html中的擺放位置。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。希望能幫助到…

Protocol Buffer技術詳解(C++實例)

原文:http://www.cnblogs.com/stephen-liu74/archive/2013/01/04/2842533.html 這篇Blog仍然是以Google的官方文檔為主線,代碼實例則完全取自于我們正在開發的一個Demo項目,通過前一段時間的嘗試,感覺這種結合的方式比較有利于培訓…

yaml 解決問題

yaml 是什么? 在 github 一些開源項目里經常可以看到 .travis.yml 文件,后來接觸持續集成這個概念時發現很多文件都是 .yml 后綴的文件。我在 阮一峰-YAML 語言教程 里了解了它的作用以及基本寫法,他的那篇文章描述的略微有點啰嗦&#xff0…

2016 7 25 鏈表

1 #include<stdio.h>2 #include<stdlib.h>3 /* 4 usingnamespacestd;5 6 structNode7 {8 int data;//數據域9 struct Node*next;//指針域10 };11 12 /*13 Create14 *函數功能&#xff1a;創建鏈表.15 *輸入&#xff1a;各節點的data16 *返回值&#xff1a;指…

php數值操作,php數值計算num類簡單操作示例

php數值計算num類簡單操作示例,在線,計算器,小數,整數,程序設計php數值計算num類簡單操作示例易采站長站&#xff0c;站長之家為您整理了php數值計算num類簡單操作示例的相關內容。本文實例講述了php數值計算num類簡單操作。分享給大家供大家參考&#xff0c;具體如下&#xff…

YAML-學習筆記!

YAML學習筆記 一、YAML簡介 YAML&#xff0c;即YAML Ain’t Markup Language的縮寫&#xff0c;YAML 是一種簡潔的非標記語言。YAML以數據為中心&#xff0c;使用空白&#xff0c;縮進&#xff0c;分行組織數據&#xff0c;從而使得表示更加簡潔易讀。 二、YAML語法 1、基本規…

CentOS遠程監控

近日&#xff0c;因工作需要&#xff0c;學習了CentOS遠程監控的水平有限&#xff0c;多指教。 遠程訪問CentOS&#xff0c;包括三種方式ssh&#xff0c;telnet&#xff0c;vnc。 本例涉及的是以vnc遠程訪問CentOS。指令在root下操作。注意&#xff1a;vnc的端口為5900&#xf…

aix oracle 10.2.0.1 升級 10.2.0.4,AIX Oracle RAC 升級到10.2.0.4.0要特別注意的問題 - 愛肯的專欄 ......

AIX Oracle RAC 升級到10.2.0.4.0過程有如下報錯(直接升級到10.2.0.4不需要應用Patch:6160398)&#xff1a;rootbwgl_db2:/u01/app/oracle/crs_1/bin# /u01/app/oracle/crs_1/install/root102.shError : Please change the CRS_ORACLE_USER id to have the following OS capabi…

將文件提交到github的兩種方法

方法一 簡要步驟如下&#xff1a; 登陸github&#xff0c;創建git倉庫。記此git倉庫的地址為[github_repository_url]&#xff0c;例如git倉庫的地址&#xff1a;https://github.com/galian123/nodejs_http_server 在本地的工程目錄執行git init&#xff0c;此工程目錄是要提…

Visual Studio 2017新版發布,極大提高開發效率丨附下載

最新的Visual Studio 2017免費下載&#xff1a;https://www.evget.com/product...【包含Professional、Enterprise、Community版本】 為任何開發、應用和平臺提供無與倫比的效率&#xff0c;Visual Studio 2017 候選發布。 提高了效率 代碼導航、IntelliSense、重構、代碼修復和…

BGP路由協議詳解(完整篇)

原文鏈接&#xff1a;http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上個月我寫一篇關于BGP協議的博文&#xff0c;曾許諾過要完善這個文檔&#xff0c;但因最近的工作和授課很忙&#xff0c;所以沒有時間進行完善。為了實現這個承諾&#xff0c;我在去外…

oracle 備份導出,oracle 怎么備份或導入導出表

exp/imp下面介紹的是導入導出的實例&#xff0c;向導入導出看實例基本上就可以完成&#xff0c;因為導入導出很簡單。數據導出&#xff1a;1 將數據庫TEST完全導出,用戶名system 密碼manager 導出到D:\daochu.dmp中exp system/managerTEST filed:\daochu.dmp fully2 將數據庫中…

GitHub+Hexo搭建自己的Blog之-本地環境部署01

前言 之前我的博客沒有綁自己的域名&#xff0c;一直在github上放著&#xff0c;訪問起來比較麻煩&#xff0c;前陣子在阿里云買了這個域名&#xff0c;配置上之后&#xff0c;就可以通過自己的域名訪問了&#xff0c;有些朋友問我這個博客怎么搭的&#xff0c;用的什么主題&am…

appsettings 連接oracle數據庫,ABP .net core集成訪問Oracle數據庫

1.添加包引用&#xff1a;Microsoft.EntityFrameworkCore.RelationalOracle.EntityFrameworkCore2.重寫DbContext OnModelCreating/// /// 判斷如果是Oracle&#xff0c;需要執行Schema/// /// protected override void OnModelCreating(ModelBuilder modelBuilder){//判斷當前…

Day08-函數(3)

import functools #偏函數 def demo(a,b,c,d):print(a,b,c,d)# def partital_demo(a,b): # demo(a,b,3,4) # partital_demo(1,2)#實現偏函數 # #固定前兩個 # demo functools.partial(demo,5,6) # demo(10,50)# #固定后兩個 # demofunctools.partial(demo,c3,d5) # demo(1…

使用VS2010編譯Qt 5.6.1過程記錄

由于Qt官方發布的Qt 5.6.1二進制安裝包沒有對應VS2010版本的&#xff0c;而我的電腦上只安裝了VS2010&#xff0c;因此只能自己編譯。 本文記錄本人的編譯安裝過程&#xff0c;以及其中遇到的一些問題。 本文使用VS2010 32位編譯Qt 5.6.1。 1. 下載Qt源代碼 Qt源代碼下載地址&…

golang 指針

指針1、簡單的定義一個指針package mainimport "fmt"func main(){var p *inti :2p &ifmt.Println("memory address i:",p) } //執行結果&#xff1a; memory address i: 0xc42000a2e02、打印指針的值package mainimport "fmt"func main(){v…

php防錯處理,更好的PHP錯誤處理

錯誤類型PHP 主要有兩種錯誤&#xff1a;觸發錯誤和異常。其中觸發錯誤大概可以分為&#xff1a;編譯錯誤、引擎錯誤和運行時錯誤&#xff0c;其中前兩個是無法捕獲的&#xff1b;異常都是可以捕獲的&#xff0c;當沒有嘗試捕獲時則會中斷代碼。觸發錯誤可以通過 error_get_las…

Windows安裝Apache注冊服務出現(OS 5)拒絕訪問。 : AH00369: Failed to open the Windows service manager,

windows安裝Apache&#xff0c;注冊服務出現“(OS 5)拒絕訪問。 : AH00369: Failed to open the WinNT service manager..."錯誤 在安裝Apache的時候&#xff0c;我下載的是zip格式&#xff0c;不是msi安裝版&#xff0c;需要自己注冊服務&#xff0c;才能在桌面任務欄里有…

算法與數據結構(三) 二叉樹的遍歷及其線索化(Swift版)

前面兩篇博客介紹了線性表的順序存儲與鏈式存儲以及對應的操作&#xff0c;并且還聊了棧與隊列的相關內容。本篇博客我們就繼續聊數據結構的相關東西&#xff0c;并且所涉及的相關Demo依然使用面向對象語言Swift來表示。本篇博客我們就來介紹樹結構的一種&#xff1a;二叉樹。在…