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()

输出结果:


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