函数的基本使用


本章概述:python基础——函数的基本使用


一、python的函数

1、函数的定义

在Python中可以使用def关键字来定义函数,而函数执行完成后我们会通过return关键字来返回函数的执行结果。函数的作用在于将大量重复的代码封装起来,方便重复调用。

1
2
3
def get():
print("不带参数")
get() #不带参数

上面的例子就是一个简单的函数,并且该函数是不带参数的。

2、变量的作用域

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

全局变量:在函数或类之外定义的变量,作用域从定义的位置开始到整个模块(也可以理解成py文件)结束。全局变量一般作为常量使用,即该变量是不变的。函数内要改变全局变量的值,需要使用 global 声明一下。

局部变量:在函数体内申明的变量,只在函数内起作用。

局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其是在循环的时候。在特别强调效率的地方或者循环次数较多的地方,可以通过将全局变量转为局部变量提高运行速度。总而言之,在循环结构中尽量不定义变量(包括不定义方法)。比如在for循环里头需要使用time.sleep()进行暂停,这时可以现在循环外把暂停定义好,a=time.time,然后在循环内直接使用a(1),这样能使运行的速度提升很多

通过locals()和globals()函数可以打印出所有的局部变量和全局变量。

1
2
3
4
5
6
7
8
a=1 #全局变量
def get():
b=2 #局部变量
print(b)
print(globals()) #打印全局变量
print(locals()) #打印局部变量

get()

全局变量和局部变量的效率比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

import time
import random
def global_test():
start=time.time()
for i in range(10000000):
a=random.randint(1,100)
end=time.time()
print("耗时{0}".format((end-start)))

global_test() #耗时5.018017768859863

def local_test():
start=time.time()
a=random.randint
for i in range(10000000):
a(1,100)
end=time.time()
print("耗时{0}".format((end-start)))

local_test() #耗时4.793867349624634

运行了好几次,结果都是下面的函数比上面的函数更省时间。

二、函数的参数

1、参数默认值

python函数可以没有参数,参数可以有默认值。带默认值的参数必须放在不带默认值的参数之后

1
2
3
4
5
6
7
def get(x,y,z=10):
return x + y + z

#如果z没有指定数值,则默认为10
get(10,12) #32
#z指定数值,则被赋值为11
get(10,12,11) #33
2、不定长参数

不定长参数允许我们输入0或者任意个参数,当一个函数的参数不明确个数时,就需要使用不定长参数,不定长参数用*表示。

1
2
3
4
5
6
7
8
9
10
# 用星号表达式来表示args可以接收0个或任意多个参数
def get(*args):
sum=0
# 可变参数可以放在for循环中取出每个参数的值
for i in args:
sum+=i
return sum

# 在调用get函数时可以传入0个或任意多个参数
print(get(1,2,3,4,5))

带参数名的不定长参数用**表示。

1
2
3
4
5
6
7
8
9
def get(**kwargs):
sum=0

# 字典类型
print(kwargs)
for i in kwargs.values():
sum+=i
return sum
print(get(a=3,b=4,d=5))
3、命名关键字参数

所谓命名关键字参数,就是写在号后的参数。它的作用在于在传入参数时必须以参数名=参数值的方式传参,并且不能传入号后面没有明确的参数。

1
2
3
4
5
6
def get(*,a,b):
print(f"{a},{b}")

get(a=1,b=2) #1,2
get(1,2) #报错
get(a=1,b=2,c=3) #报错

命名关键字参数可以跟不定长参数混合使用。

三、python中的内置函数

python中有一类函数,不需要我们去进行定义也不需要我们import进行引入就可以直接使用,称之为内置函数,这些内置函数都是很有用也是最常用的,下面的表格列出了一部分的内置函数。

函数 说明
abs 返回一个数的绝对值,例如:abs(-1.3)会返回1.3
bin 把一个整数转换成以'0b'开头的二进制字符串,例如:bin(123)会返回'0b1111011'
chr 将Unicode编码转换成对应的字符,例如:chr(8364)会返回'€'
hex 将一个整数转换成以'0x'开头的十六进制字符串,例如:hex(123)会返回'0x7b'
input 从输入中读取一行,返回读到的字符串。
len 获取字符串、列表等的长度。
max 返回多个参数或一个可迭代对象中的最大值,例如:max(12, 95, 37)会返回95
min 返回多个参数或一个可迭代对象中的最小值,例如:min(12, 95, 37)会返回12
oct 把一个整数转换成以'0o'开头的八进制字符串,例如:oct(123)会返回'0o173'
open 打开一个文件并返回文件对象。
ord 将字符转换成对应的Unicode编码,例如:ord('€')会返回8364
pow 求幂运算,例如:pow(2, 3)会返回8pow(2, 0.5)会返回1.4142135623730951
print 打印输出。
range 构造一个范围序列,例如:range(100)会产生099的整数序列。
round 按照指定的精度对数值进行四舍五入,例如:round(1.23456, 4)会返回1.2346
sum 对一个序列中的项从左到右进行求和运算,例如:sum(range(1, 101))会返回5050
type 返回对象的类型,例如:type(10)会返回int;而type('hello')会返回str