python第四篇

函数

函数如果开发人员没有写入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       #最小年龄
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值