Python之函數、變量

一、Python函數的定義和規則:

1、規則:

  • 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號 ()
  • 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
  • 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
  • 函數內容以冒號起始,並且縮進。
  • return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。

2、函數的作用:

(1)、提高應用的模塊性

(2)、提高代碼的重複利用率

(3)、用來實現單一,或相關聯功能的代碼段

3、定義

語法:

def 函數名(參數列表):
    函數體

實例:

def hello():
    """
    僅用於展示函數定義
    :return:
    """
    print("Hello World")


hello()  # 函數調用
# 計算面積函數
def area(width, height):
    """
    根據寬高計算面積
    :param width: 寬度
    :param height: 高度
    :return: 面積
    """
    return width * height


def print_welcome(name):
    """
    根據傳入的名字打印歡迎"名字"
    :param name:傳入的名字
    :return: 打印語句
    """
    print("Welcome", name)


print_welcome("Wangdoudou")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))

 

二、函數的具體使用

1、參數傳遞

(1)、可更改(mutable)對象:列表、字典,修改的跟原來的是同一個引用

def changeme(mylist):
    """
    修改傳入的列表
    :param mylist: 
    :return: 
    """
    mylist.append([1, 2, 3, 4])
    print("函數內取值: ", mylist)
    return


# 調用changeme函數
mylist = [10, 20, 30]
changeme(mylist)
print("函數外取值: ", mylist)

 

(2)、不可更改(immutable)對象:字符串、數字、元組,傳參時相當於重新生成了對象

a = "wangdoudou"
b = 15


def Changestr(a):
    a = "haha"


def Changenum(b):
    b = 20


Changestr(a)
Changenum(b)

print("a = ", a)
print("b = ", b)

 

2、函數參數:

函數定義時的參數爲形參:調用時才分配內存單元,調用結束釋放內存

調用函數時傳入的參數值爲實參

參數類型:

(1)、必需參數:須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣

def printme(str):
    """
    打印任何傳入的字符串
    :param str:
    :return:
    """
    print(str)
    return


# 調用printme函數
printme("函數定義了幾個參數,就必須傳入幾個參數")

(2)、關鍵字參數:允許函數調用時參數的順序與聲明時不一致,因爲 Python 解釋器能夠用參數名匹配參數值

def printinfo(name, age):
    """
    打印任何傳入的字符串
    :param name: 名字
    :param age: 年齡
    :return:
    """
    print("名字: ", name)
    print("年齡: ", age)
    return


# 調用printinfo函數
printinfo(age=50, name="wangdoudou")

(3)、默認參數:調用函數時,如果沒有傳遞參數,則會使用默認參數

def printinfo(name, age=35):
    """
    打印用戶的名字和年齡
    :param name:
    :param age:
    :return:
    """
    print("名字: ", name)
    print("年齡: ", age)
    return


# 調用printinfo函數
printinfo(age=50, name="wangdoudou")
print("------------------------")
printinfo(name="wangdoudou")

(4)、不定長參數:處理比聲明時更多的參數

一個星號*:參數會以元組(tuple)的形式導入,存放所有未命名的變量參數

基本語法:

def functionname([formal_args,] *var_args_tuple ):
   "函數_文檔字符串"
   function_suite
   return [expression]
def printinfo(arg1, *vartuple):
    print("輸出: ")
    print(arg1)
    print(vartuple)
    for var in vartuple:
        print(var)
    return


# 調用printinfo 函數
printinfo(10)
printinfo(70, 60, 50)

 

兩個星號**:參數會以字典的形式導入

基本語法:

def functionname([formal_args,] **var_args_dict ):
   "函數_文檔字符串"
   function_suite
   return [expression]
def printinfo(arg1, **vardict):
    print("輸出: ")
    print(arg1)
    print(vardict)


# 調用printinfo 函數
printinfo(1, a=2, b=3)

 

一個星號和兩個星號一塊用:可接受任意長度,任意類型的參數

def test(x, *args, **kwargs):
    print(x)
    print(args, args[3])
    print(kwargs, kwargs['y'])


test(1, 2, 3, 4, 5, 6, 7, y="hehe", z=110)

 

聲明函數時,參數中星號 * 可以單獨出現,如果單獨出現星號 * 後的參數必須用關鍵字傳入:

def f(a,b,*,c):
    return a+b+c

錯誤調用:f(1,2,3) 

正確調用:f(1,2,c=3)

 

5、return語句:return [表達式] 語句用於退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None

def sum(arg1, arg2):
    """
    返回2個參數的和
    :param arg1:
    :param arg2:
    :return: 返回2個參數的和
    """
    total = arg1 + arg2
    print("函數內 : ", total)
    return total


# 調用sum函數
total = sum(10, 20)
print("函數外 : ", total)

 

三、匿名函數:python 使用 lambda 來創建匿名函數,不再使用 def 語句這樣標準的形式定義一個函數

1、定義

語法:

lambda [arg1 [,arg2,.....argn]]:expression

實例:

sum = lambda arg1, arg2: arg1 + arg2
print("相加後的值爲 : ", sum(10, 20))

2、特性:

  • lambda 只是一個表達式,函數體比 def 簡單很多。
  • lambda 的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
  • lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裏的參數。
  • lambda 函數的目的是調用小函數時不佔用棧內存從而增加運行效率。

 

四、變量作用域:變量的作用域決定了在哪一部分程序可以訪問哪個特定的變量名稱

1、變量作用域類型

  • L (Local) 局部作用域
  • E (Enclosing) 閉包函數外的函數中
  • G (Global) 全局作用域
  • B (Built-in) 內建作用域

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

示例:

x = int(2.9)  # 內建作用域
g_count = 0  # 全局作用域


def outer():
    o_count = 1  # 閉包函數外的函數中

    def inner():
        i_count = 2  # 局部作用域

 

Tips:Python 中只有模塊(module),類(class)以及函數(def、lambda)纔會引入新的作用域,其它的代碼塊(如 if/elif/else/、try/except、for/while等)是不會引入新的作用域的,也就是說這些語句內定義的變量,外部也可以訪問

 

2、全局變量和局部變量:定義在函數內部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域,局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序範圍內訪問。調用函數時,所有在函數內聲明的變量名稱都將被加入到作用域中。

實例:

total = 0  # 這是一個全局變量


def sum(arg1, arg2):
    total = arg1 + arg2  # total在這裏是局部變量.
    print("函數內是局部變量 : ", total)
    return total


# 調用sum函數
sum(10, 20)
print("函數外是全局變量 : ", total)

 

3、global 關鍵字:內部作用域修改外部作用域的變量

實例:

num = 1


def fun1():
    global num  # 使用 global 關鍵字修改外部變量
    print(num)
    num = 123
    print(num)


fun1()
print(num)

 

4、nonlocal關鍵字:修改嵌套作用域(enclosing 作用域,外層非全局作用域)中的變量

實例:

def outer():
    num = 10

    def inner():
        nonlocal num  # nonlocal關鍵字聲明
        print(num)
        num = 100
        print(num)

    inner()
    print(num)


outer()

 

 

五、函數作用域:輸出的結果是從當前運行的代碼塊開始,然後逐級向上運行

name = "wangdoudou"


def printname():
	name = "wangdoudou1"

	def test():
		name = "wangdoudou2"
		print(name)

	return test


# 第一種執行方式
printname()()

# 第二種執行方式
res = printname()
res()

輸出結果:


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章