函数
函数如果开发人员没有写入return语句的话那么python会默认有个return语句只不过值为None
return 的值是供python回调使用的,并不会输出出来
print() 是内置函数 输出来的值,并不能直接被python回调使用
说到函数就要扯到一个概念(类,对象),因为python是面向对象更彻底的编程语言(类与对象 的 继承、封装、多态) ,此外具体还涉及到魔法函数,抽象基类等等
类是创建对象的模板, 对象是类的实例
python 一切皆对象
(慕课网python编程)
函数是一段预先定义的、由若干代码构成的代码段、,用于执行完全相同的逻辑,实现特定的功能,可以设定不同的初始条件并被多次调用。函数大大提高了代码的重用性、可读性和可靠性。python包含内建函数的引用、库模块中的函数,自定义函数和使用方便的lamba表达式(函数)。
函数分类
内建函数(内置函数)
内建函数(内置函数)(列举了部分内建函数,这里直接引用了python内置函数官网)
函数 | 功能 |
---|---|
abs(number) | 返回一个实数的绝对值 |
chr(number) | 返回ASCLL码值为定给数字的的字符 |
int(number) | 将数字转化为整数 |
ord(char) | 返回给定字符的AASCLL码值 |
round(float[ ,n] ) | 将给定的浮点数四舍五入,小数点后面保留n位(默认为0) |
max(n1, n2, n3…) | 返回最大值 |
print(str) | 显示字符 |
库模块
这里就涉及到python的标准库模块还有第三方库模块
顾名思义python标准库模块(人们喜欢叫标准库)是python自带的库模块不需要pip安装,可以直接引入使用
但是第三方库模块(人们喜欢叫第三方库)不是python自带的,所以在引用相关库模块时需要用pip install + 库名(安装下载好的第三方库数据)再进行相关数据库的使用
python标准库官网
第三方库下载官网
lambda函数定义
这个函数用来声明函数,但是值可以包含一个表达式。该起表达式的计算结果可以被看作函数的返回值,不允许包含复合语句,但在表达式中可以调用其他函数。匿名函数默认返回表达式的值。lambda函数的语法格式如下:
函数名 = lambda[参数1,[参数2,[…,[参数n] :表达式 (方括号里的内容表示可以没有也可以有)
例如:
s = lambda x, y :x+y
s(2, 3)
#运行结果 5
运行lambda函数的时候可以预先设置默认值:
s = lambda x, y, z = 10: x+y+z
s(20,20)
#运行结果为 50
lambda函数求圆面积
import math
r = 10
result = lambda r :math.pi*r*r #这里引用了math库模块 pi表示 数学里圆周率 兀 再使用lambda函数进行计算
print("半径为",r,"的圆面积为:",result(r)) #把lambda计算的结果输出出来
lambda函数也可以用在def函数中。例如
import math
def triangle_area(a): #求三角形面积,a为底边长
return lambda h : a*h/2 #h为三角形的高
triangle_area(3)(2) #a = 2,h = 3
#等价于以下代码,效果一样 把def直接写成lambda形式
triangle_area = lambda a : lambda h : a*h/2
triangle_area(3)(2)
####运算结果都是3.0 浮点数
列表解析式
当用户想要对列表中的每个元素执行一个特定的函数时,最常见的方法是是使用for循环。但是更简单的方法是使用列表解析式。
如果list()是一个列表 ,那么下面的语句会创建一个新的列表list1,并将list()中每个元素放入列表中,而f()函数可以是python内建函数,也可以是自定义函数
list1 = [f(x) for x in list()]
具体使用方法例如:
import math
list0 = [1,4,9,16,25,36]
list1 = [math.sqrt(x) for x in list0]
pirnt(list1)
# 运行结果[1.0, 2.0, 3.0, 4.0, 5.0, 6.0] 每个元素都被开方了并且输出结果都为浮点数
此外也可以将math.sqrt()替换为自定义函数
list0 = [1,4,9,16,25,36]
def g(x):
return(x**(1/2))
print([g(x) for x in list0]) #必须要有[]或者被list()包围 不然输出的就是一个生成器对象。需要转化为元组时 ()或者被tuple()包围
列表解析中for子句能够可选的跟随一个if语句。
[g(x) for x in list() if x % 2 ==1]
表达式 >> 语句 >> 代码块(模块)>> 函数(对象) >>类
eg print(1+1) 这就是一个语句,1+1是表达式
函数的嵌套使用 :在函数里面调用另外一个函数。
函数的嵌套使用又分为两种 具体看函数的嵌套使用
函数的递归调用 :函数调用它本身。
函数参数值的传递
位置参数
位置参数是比较常用的形式,在调用函数时,实参和形参的顺序必须要严格一致,并且数量也要一样
def func(a,b,c):
print(a,b,c)
func(1,2,3)
带默认值的参数
在自定义函数时,可以给出一个或者几个参数指定默认值,这是一种非常有用的定义方式。对不可变类型的参数而言,默认值只在定义时一次性生效。但是如果参数是可变对象,入列表、字典、或实例,则情况会有所不同。
def func1(name, welcome = ',welcome to stiei'):
print(name+welcome)
func1('你好')
#运行结果 你好,welcome to stiei
注意:当多调用函数并且不为带默认值的参数传递值时,带默认值的参数只在定义时进行一次解释或初始化,对列表、字典这样可变类型的默认值的参数来说,只一点可能会导致很严重的逻辑错误
但参数是一个可变对象的时候:
def func1(i,L=[]): #这里用了一个空列表代表L的值 是一个可变值
L.append(i)
return L
func1("乔丹") #输出列表 ["乔丹"]
func1("姚明") #输出列表 ["乔丹","姚明"]
关键字参数
例如
def func1(age, name, weight = 90):
print(f'{age}岁的{name},体重为{weight}')
func1(18, "小明", 45) #用实参去一一给赋值形参 缺点就是必须赋值的顺序要一致
#运行结果 18岁的小明,体重为45
而关键字参数就是在给形参赋值的时候直接带上形参
def func1(age, name, weight = 90):
print(f'{age}岁的{name},体重为{weight}')
func1(age = 18,name = "小明",weight = 45) #这种形式的优点 赋值即使顺序是乱的也能准确赋值
可变长参数(传递参数可以是元组和字典)
可变长参数主要有两种形式:在参数前面加一个星号* 或者加两个星号 **
1)* parameter(参数)用来接收多个位置参数并将其放在一个元祖中
2)** parameter(参数)用来接收多个关键字参数并存放到字典中
def func1(z1, *z2, **z3): #*z2形参表示多个实参放到一个元组里 **z3形参表示多个实参放到一个字典里
return(z1, z2, z3)
print(func1(1, 2, 4, 5, y1=2, y2=4)) #这里z1表示单个形参 *z2对应2,4,5 z3对应y1=2, y2=4表示这是一个字典
#运行结果 (1, (2, 4, 5), {'y1': 2, 'y2': 4}) 返回的结果是一个元组 我觉得可能因为涉及拆包的过程所以python默认以元组形式处理
参数是序列解包(可以解包 列表,元组,字典)
参数是序列解包指的是可以实参序列前天加一个星号将其解包,然后传递给多个单变量形参,
如果函数实参是字典,则可以在前面添加两个星号,进行解包后实参将会被当作普通位置参数对待,并且会在关键字参数和使用两个星号进行解包的参数之前进行处理
def demo(a,b,c):
print(a+b+c)
sep = [1,2,3] #利用sep变量接收的值为一个列表 接收的值可以改为元组或者字典
demo(*sep) #同理可以解包元祖,不过解元祖的时候与解列表一样都是* 而字典是**
变量的作用域
局部变量
局部变量是指只在函数内部定义的普通变量,只能被同一函数体内部的语句访问,并且在退出这个函数后,就不在了(每次函数被调用,都会重新创建变量)。局部变量的引用比全局变量更快应当优先考虑使用
全局变量
定义在函数外面,如果函数要引用此变量的话就要先使用global定义
比如
a = 0 #a就是一个全局变量
def func1(.....):
global a #用global定义
...........
命名常量
在大型程序中,应当避免使用全局变量,因为这样会使得程序可读性降低,并且容易引起错误,不过,有一类被称为命名常量的全局变量,我们习惯使用大写字母的命名方式来创建一个这样的全局变量,使用下划线分隔开,并赋值给其一个常量值。
例如
CIRCLE_PI = 3.1415926 #圆周率
MINIMUM_VOTING_AGE = 18 #最小年龄