栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python笔记6(函数)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python笔记6(函数)

文章目录
  • python的函数分类
  • 函数的定义和调用
  • 形参和实参
  • 返回值
  • 变量的作用域(全局变量和局部变量)
  • 数的传递
    • 传递可变对象的引用
    • 传递不可变对象的引用

函数的作用,不仅可以实现代码的复用,更能实现代码的一致性。

python的函数分类

1.内置函数
我们前面使用的str()、list()、len()等这些都是内置函数,我们可以拿来直接使用。
2.标准库函数
我们可以通过import语句导入库,然后使用其中定义的函数
3.第三方库函数
Python社区也提供了很多高质量的库。下载安装这些库后,也是通过import语句导入,然后可以使用这些第三方库的函数
4.用户自定义函数
用户自己定义的函数,显然也是开发中适应用户自身需求定义的函数。今天我们学习的就是如何自定义函数。

函数的定义和调用

定义函数的语法如下:

def  函数名 ([参数列表]) :#def->define定义
	'''文档字符串'''
	函数体/若干语句
def test01():
    print("*"*10)
    print("#"*10)
test01()

!!!要点:
1.我们使用def来定义函数,然后就是一个空格和函数名称;
(1)Python执行def时,会创建一个函数对象,并绑定到函数名变量上。

2.参数列表
(1)圆括号内是形式参数列表,有多个参数则使用逗号隔开
(2)形式参数不需要声明类型,也不需要指定函数返回值类型
(3)无参数,也必须保留空的圆括号
(4)实参列表必须与形参列表一一对应
3.return返回值
(1)如果函数体中包含return语句,则结束函数执行并返回值;
(2)如果函数体中不包含return语句,则返回None值。
4.调用函数之前,必须要先定义函数,即先调用def创建函数对象
(1)内置函数对象会自动创建
(2)标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句

形参和实参
def printMax(a,b):
    '''实现两个数的比较,并返回较大的值'''
    if a>b:
        print(a,"较大值")
    else:
        print(b,"较大值")

printMax(10,20)# 20 较大值
printMax(35,5)# 35 较大值

文档字符串(函数的注释)

def print_star(n):
    '''根据传入的n,打印多个星号'''
    print("*"*n)
#我们调用help(函数名.__doc__)可以打印输出函数的文档字符串。
help(print_star)

返回值

return返回值要点:
1.如果函数体中包含return语句,则结束函数执行并返回值;
2.如果函数体中不包含return语句,则返回None值。
3.要返回多个返回值,使用列表、元组、字典、集合将多个值“存起来”即可。

函数也是对象,内存底层分析

def print_star(n):
    print("*"*n)


print(print_star)
print(id(print_star))

c = print_star#注意没有括号,因为没有调用堆

c(3)

print(id(print_star))
print(id(c))

变量的作用域(全局变量和局部变量)

变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。变量分为:全局变量、局部变量。
全局变量:

1.在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块结束。
2.全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
3.全局变量一般做常量使用。
4.函数内要改变全局变量的值,使用global声明一下

局部变量:

1.在函数体中(包含形式参数)声明的变量。
2.局部变量的引用比全局变量快,优先考虑使用。
3.如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量
输出局部变量和全局变量

a = 100

def f1(a,b,c):
    print(a,b,c)
    print(locals())            #打印输出的局部变量
    print("#"*20)
    print(globals())           #打印输出的全局变量

f1(2,3,4)


局部变量和全局变量效率测试

局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其是在循环的时候。
在特别强调效率的地方或者循环次数较多的地方,可以通过将全局变量转为局部变量提高运行速度。

import math
import time

def test01():
    start = time.time()
    for i in range(10000000):
        math.sqrt(30)
    end = time.time()
    print("耗时{0}".format((end-start)))

def test02():
    b = math.sqrt
    start = time.time()
    for i in range(10000000):
        b(30)
    end = time.time()
    print("耗时{0}".format((end-start)))

test01()
test02()

数的传递

函数的参数传递本质上就是:从实参到形参的赋值操作。 Python中“一切皆对象”,所有的赋值操作都是“引用的赋值”。所以,Python中参数的传递都是“引用传递”,不是“值传递”。具体操作时分为两类:

1.对“可变对象”进行“写操作”,直接作用于原对象本身。
2.对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”)

可变对象有:

字典、列表、集合、自定义的对象等

不可变对象有:

数字、字符串、元组、function等

传递可变对象的引用

传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等),实际传递的还是对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。

b = [10,20]
def f2(m):
    print("m:",id(m))       #b和m是同一个对象
    m.append(30)    #由于m是可变对象,不创建对象拷贝,直接修改这个对象

f2(b)
print("b:",id(b))
print(b)

传递不可变对象的引用

传递参数是不可变对象(例如:int、float、字符串、元组、布尔值),实际传递的还是对象的引用。在”赋值操作”时,由于不可变对象无法修改,系统会新创建一个对象。

a = 100
def f1(n):
    print("n:",id(n))        #传递进来的是a对象的地址
    n = n+200            #由于a是不可变对象,因此创建新的对象n
    print("n:",id(n))    #n已经变成了新的对象
    print(n)
f1(a)
print("a:",id(a))


通过id值我们可以看到n和a一开始是同一个对象。给n赋值后,n是新的对象。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1001471.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号