函数的定义
https://baike.baidu.com/item/%E5%87%BD%E6%95%B0/301912?fr=aladdin
【在数学中函数的定义】
函数的传统定义:一般的,在一个变化过程中,假设有两个变量x、y,如果对于任意一个x都有唯一确定的一个y和它对应,那么就称x是自变量,y是x的函数。x的取值范围叫做这个函数的定义域,相应y的取值范围叫做函数的值域
函数的近代定义:给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示,函数概念含有三个要素:定义域A、值域C和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。
【编程语言中函数的定义】
编程中的函数可以理解为一段预处理好的程序,能完成特定的功能。
函数的作用
对于完成某项工作的代码块,可以反复使用
通过将一段有规律的、重复的代码定义为函数,来达到一次编写多次调用的目的。使用函数可以提高代码的重复利用率。
创建函数
语法格式:
def function_name(parameter_list):
'''comments'''
function_body
pass空语句
表示空语句,一般起到占位作用。
在Python3.x版本中,允许在可以使用表达式的任何地方使用...来省略代码,可以认为是pass空语句的替代方案。
调用函数
也就是执行函数,语法格式:
function_name(parameters_value)
参数传递
在调用函数时,主函数与被调用函数之间有数据传递关系时,这就是有参数的函数形式。
了解形式参数和实际参数
形式参数:在定义函数时,函数名后面括号中的参数,也称形参
实际参数:在调用一个函数时,函数名后面括号中的参数,也称实参
了解值传递和引用传递
值传递:当实参为不可变对象时
引用传递:当实参为可变对象时
值传递和引用传递的基本区别:进行值传递后,改变形参的值,实参的值不变;而进行引用传递后,改变形参的值,实参的值也一同改变。
位置参数
也称必备参数,必须按照正确的顺序传到函数中。即调用时实参的数量和位置必须与定义时形参的数量和位置是一样的。
关键字参数
是指使用形参的名字来确定输入的参数值。函数调用时,不再需要与形参的位置完全一致,只要将参数名写正确即可。
示例:
# 函数定义创建
def fun_bmi(person, height, weight):
'''功能:计算BMI指数
person:人员姓名
height:身高
weight:体重
'''
pass
# 函数调用
fun_bmi(height = 1.83, weight = 60, person = '路人甲')
为参数设置默认值
定义函数时,可以指定形参的默认值。
- 指定默认值的参数必须放在所有参数的最后,否则将产生语法错误。
- 在Python中,可以使用“函数名.__defaults__”查看函数的默认值参数的当前值,其结果是一个元组。
- 使用可变对象作为函数参数的默认值时,多次调用可能会导致意料之外的情况。因为可变对象时引用传递,为了防止这种情况,最好使用None作为可变对象的默认值。
可变参数
也称不定长参数,即传入函数的实参可以是任意个。
定义可变参数时,有两种形式:
*parameter | 表示接收任意多个实际参数并将其放到一个元组中 |
**parameter | 表示接收任意多个显式赋值的实参,并将其放到一个字典中。 |
示例1-1:*parameter
def print_player(*name):
print('\n我喜欢的NBA球员有:')
for item in name:
print(item)
print_player('邓肯','乔丹','姚明')
如果想要使用一个已经存在的列表作为函数的可变参数,可以在列表的名称前加“*”。
示例1-2:*listname
def print_player(*name):
print('\n我喜欢的NBA球员有:')
for item in name:
print(item)
param = ['邓肯','乔丹','姚明']
print_player(*param)
示例2-1:**parameter
def print_sign(**sign):
for key,value in sign.items():
print('[' + key + '] 的绰号是:' + value)
print_sign('邓肯':'石佛', '罗宾逊':'海上将军', '帕克':'跑车')
如果想要使用一个已经存在的字典作为函数的可变参数,可以在字典的名称前面加“**”。
示例2-2:**parameter
def print_sign(**sign):
for key,value in sign.items():
print('[' + key + '] 的绰号是:' + value)
dict1 = {'邓肯':'石佛', '罗宾逊':'海上将军', '帕克':'跑车'}
print_sign(**dict1)
返回值
使用return语句为函数指定返回值。语法格式如下:
result = return [value]
只要执行到return语句,就会直接结束函数的执行。
返回的值可以是任意类型,若返回多个值,那么result中保存的是一个元组。
当函数中没有return语句时,或者省略了return语句的参数时,将返回None,即返回空值。
变量的作用域
变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。
一般根据变量的有效范围,将变量分为“局部变量”和“全局变量”。
局部变量 | 全局变量 | |
定义位置 | 在函数体内定义 | 在函数体外定义 或在函数体内定义并使用global修饰的变量 |
有效范围 | 仅在函数内部有效 | 在函数内外都可以访问 |
只在函数运行时创建 在函数运行之前或运行完毕之后,所有的名字都不存在 |
当局部变量与全局变量重名时,对函数体内的变量进行赋值后,不影响函数体外的变量。
若想在函数体内改变全局变量的值,需要在定义局部变量时,使用global关键字修饰。
尽管Python允许全局变量和局部变量重名,但在实际开发时,不建议这么做。
匿名函数
没有名字的函数,只使用一次。
在Python中,使用lambda表达式创建匿名函数,语法格式:
result = lambda [arg1[, arg2, ..., argn]]:expression
result:用于调用lambda表达式
[arg1[, arg2, ..., argn]]:可选参数,用于指定要传递的参数列表
expression:必选参数,用于指定一个实现具体功能的表达式。如果有参数,那么在该表达式中将应用这些参数
示例:
import math
def circle_area(r):
result = math.pi * r * r
return result
r = 10
print('半径为', r, '的圆面积是:', circle_area(r))
使用lambda表达式时,参数可以有多个,用逗号分隔,但是表达式只能有一个,即只能返回一个值,而且不能出现其他非表达式语句,如:for或while等。
虽然使用lambda表达式比使用自定义函数的代码减少了一些,但是在使用lambda表达式时,需要定义一个变量,用于调用该lambda表达式,否则将输出类似的结果:
at 0x0000000002FDD510> lambda表达式的首要用途是指定短小的回调函数。
常用Python内置函数
内置函数 | 作用 |
---|---|
dict() | 用于创建一个字典 |
help() | 用于查看函数或模块用途的详细说明 |
dir() | 不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息 |
hex() | 用于将十进制整数转换成十六进制,以字符串形式表示 |
next() | 返回迭代器的下一个项目 |
divmod() | 把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a//b, a%b) |
id() | 用于获取对象的内存地址 |
sorted() | 对所有可迭代的对象进行排序操作 |
ascii() | 返回一个表示对象的字符串,但是对于字符串中的非ASCII字符则返回通过rept()函数使用\x,\u或\U编码的字符 |
oct() | 将一个整数转换成八进制字符串 |
bin() | 返回一个整数int或者长整数long int的二进制形式 |
open() | 用于打开一个文件 |
str() | 将对象转化为适于人阅读的形式 |
sum() | 对序列进行求和计算 |
filter() | 用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表 |
format() | 格式化字符串 |