函数的定义
函数是指将一组语句的集合通过一个名字(函数名)封装起来,想要执行这段函数,通名函数名来进行调用
特性:
1.减少代码的重复性
2.程序的扩展性
3.对程序的可维护性
语法的定义:
def 函数名()
代码块
函数名()
函数参数
形参
只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量,形参只是形式上的值
实参
实参是指实际产生的值,可以是常量、变量、表达式、函数等
def fun(x,y):# 这里的参数就是形参
res = x+y
return res
a = fun(1,2)# 传进来的参数是指实参
print(a)
默认参数
默认参数是指在定义形参的时候,把定义好的值以=赋值给形参,在调用的时候可以不指定参数,默认使用这个值,默认参数必须放到位置函数后面
def fun(name,age,det='IT'):
print("""
name: %s
age: %s
det: %s
"""%(name,age,det))
fun('abc',22)
#输出结果:
# name: abc
# age: 22
# det: IT
#不指定参数默认以定义好的形参来进行调用
关键函数
关键函数是指指定了参数名的函数就叫关键函数,不需要按照顺序传值,但是关键函数必须要在位置参数后面
def fun(name,age,det='IT'):
print("""
name: %s
age: %s
det: %s
"""%(name,age,det))
fun(age=22,name='ab')
#输出结果:
# name: ab
# age: 22
# det: IT
非固定参数
需要传多个值可以使用非固定参数
*args:传入多个参数,多个参数会以元组方式打印
def fun(name,age,*args):
print("""
name: %s
age: %s
det: %s
"""%(name,age,args))
fun('ab',22,'CN','Python','IT')
'''
输出结果:
name: ab
age: 22
det: ('CN', 'Python', 'IT')
'''
**kwargs:会把多余的传入的参数变成一个dict方式,以关键字来进行传值
def fun(name,age,*args,**kwargs):
print(name,age,args,kwargs)
fun('ab',22,'CN','Python',detp='IT',salary=1222)
'''
输出结果:
ab 22 ('CN', 'Python') {'detp': 'IT', 'salary': 1222}
'''
返回值
返回值是指函数外部的代码想要获取函数执行的结果,就可以使用return语句来把结果进行返回
注意点:
1.如在函数中遇到return语句就会停止并返回执行的结果,也就是遇到return语句就代表着函数代码的结束
2.如未指定return的值,默认会返回None
def fun(x,y):
res = x*y
if res > 5:
return True
else:
return False
a = fun(3,5)
if a:
print('这是大于五的数!')
else:
print('这是小于五的数')
#输出结果:
#这是大于五的数!
全局与局部变量
局部变量:是指在函数内定义的变量,只在函数内部和效
全局变量:是指在程序一开始的位置定义的变量,在全局生效
全局变量作用域是整个程序,局部变量作用域是定义该变量的函数
当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用
作用域
作用域即活动的范围
- 全局范围:全局存活,全局有效
- 局部范围:临时存活,局部有效
在函数中修改全局变量可使用global来进行修改
name = 'ab'
def func():
global name
name = 'ac'
print('里面的',name)
func()
print('外面的',name)
#结果:
#里面的 ac
#外面的 ac
嵌套函数
嵌套函数是指函数里面再放一个函数
name = 'ab'
def foo():
name = 'ac'
def foo1():
name = 'ad'
print('第三层',name)
foo1()
print('第二层',name)
foo()
print('最外层',name)
'''
第三层 ad
第二层 ac
最外层 ab
'''
匿名函数
匿名函数是指不指定函数名的函数,主要用于与其它函数来进行配合使用
def fucn(x,y):
return x**y
a = fucn(2,3)
print(a)
#匿名函数
b = lambda x,y:x**y
print(b(2,3))
#搭配其它函数使用
a = map(lambda x:x*2[1,3,5,7])
for i in a:
print(i)
#输出:2 6 10 14
高阶函数
高阶函数是指一个函数可以接收另一个函数作为参数,满足任一个条件即是高价函数
- 接受一个或多个函数作为输入
- return 返回另外一个函数
def add(x,y,f):
return f(x)+f(y)
a = add( 3, -6,abs)
print(a)
递归
递归是指在函数内部调用自身
def fucn(x):
v = int(x/2)
print(v)
if v > 0:
fucn(v)
print(x)
#输出:
'''
5
2
1
0
1
2
5
10
'''
递归特性:
- 必须有一个明确的结束条件
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
递归的实际应用,二分查找
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
def binary_search(dataset,find_num):
print(dataset)
if len(dataset) > 1:
mid = int(len(dataset) / 2) # 将列表一分二
if dataset[mid] == find_num: # find it
print('找到数字',dataset[mid])
elif dataset[mid] > find_num: # 找到的数在左面列表
print(" 33[31;1m数字在mid[%s]左面 33[0m"% dataset[mid])
return binary_search(dataset[0:mid], find_num)
else:
print(' 33[32;1m数字在mid[%s]右面 33[0m'%dataset[mid]) #找到的数在右面列表
return binary_search(dataset[mid + 1:], find_num)
else:
if dataset[0] == find_num:
print('成功找到数字',dataset[0])
else:
print("没的分了,要找的数字[%s]不在列表里"%find_num)
binary_search(data,55)
内置函数
内置函数解析
函数名 | 解析 | 例子 |
---|---|---|
abs() | 返回数字的绝对值 | print "abs(-45) : ", abs(-45) |
divmod() | 把除数与余数运算结果结合起来,返回一个包含商和余数的元组(a//b,a%b) | divmod(1+2j,1+0.5j)输出 ((1+0j), 1.5j) |
staticmethod() | 返回函数的静态方法 | |
all() | 用于判断给定的可迭代参数 iterable 中的所有元素是否不为 0、''、False 或者 iterable 为空,如果是都不为空返回 True,否则有一个为空返回 False | |
enumerate() | 用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 | |
int() | 强制转成一个整数 | |
ord() | 返回字符在ASCII中的数字 | ord('a')返回 97 |
chr() | 返回数字在ASCII中的字符 | chr(99) 返回'c' |
str() | 将对象转化为适于人阅读的形式 | |
any() | 用于判断给定的可迭代参数 iterable 是否全部为空对象,如果都为空、0、false,则返回 False,如果不都为空、0、false,则返回 True | |
eval() | 用来执行一个字符串表达式,并返回表达式的值。 | |
isinstance() | 来判断一个对象是否是一个已知的类型 | |
sum() | 方法对系列进行求和计算 | |
issubclass() | 用于判断参数 class 是否是类型参数 classinfo 的子类 | |
super() | 是用于调用父类(超类)的一个方法 | |
bin() | 返回一个二进制数 | |
property() | 在新式类中返回属性值。 | |
bool() | 将给定参数转换为布尔类型,如果没有参数,返回 False | |
filter() | 用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表 | |
bytearray() | 返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256 | |
callable() | 用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。 | |
locals() | 以字典类型返回当前位置的全部局部变量 | |
min() | 返回给定参数的最小值 | |
max() | 返回给定参数的最大值 | |
setattr() | 函数对应函数 [getatt()],用于设置属性值,该属性必须存在。 | |
dir() | 用于查找 | |
hex() | 转换成16进制数 | |
next() | 返回迭代器的下一个项目。 | |
slice() | 实现切片对象,主要用在切片操作函数里的参数传递 | |
id() | 用于查看对象的内存地址 | |
object() | 返回一个对象 | |
sorted() | 对所有可迭代的对象进行排序操作 | |
ascii() | 返回字符在ASCII的中位置 | |
oct() | 转成8进制 | |
exec() | 执行储存在字符串或文件中的 Python 语句 | |
pow() | 返回 x,y(x的y次方) 的值。 | |
bytes() | 将字符串转成bytes格式 | |
frozenset() | 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。 | |
vars() | 返回对象object的属性和属性值的字典对象。 | |
classmethod | 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。 | |
getattr() | 用于返回一个对象属性值。 | |
repr() | 将对象转化为供解释器读取的形式 | |
zip() | 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。 | |
compile() | 将一个字符串编译为字节代码。 | |
globals() | 用于修改全局的变量 | |
map() | 提供的函数对指定序列做映射 | |
reversed() | 反转列表的元索 | |
import() | 用于动态加载类和函数 | |
delattr() | 用于删除属性 | |
hash() | 用于获取取一个对象(字符串或者数值等)的哈希值 | |
memoryview() | 返回给定参数的内存查看对象(Momory view) | |
set() | 创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等 |
**内置参数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii