一、函数的相互调用
def eat(name,food): print('{}喜欢吃的食物:{}'.format(name,food)) def congratulate(offer_name,money): '''庆祝拿到offer''' print('{}拿到了{}元的offer'.format(offer_name,money)) eat(offer_name,'小龙虾') congratulate('zjx',8000) ''' zjx拿到了8000元的offer zjx喜欢吃的食物:小龙虾 '''
注意:调用函数的时候必须先定义
函数不要相互调用,相互调用会导致递归错误,内存有限,一直循环,内存会爆掉
函数不要自己调用自己,否则也会导致递归错误
1)调用函数的时候必须先定义
def congratulate(offer_name,money): '''庆祝拿到offer''' print('{}拿到了{}元的offer'.format(offer_name,money)) eat(offer_name,'小龙虾') congratulate('zjx',8000) def eat(name,food): print('{}喜欢吃的食物:{}'.format(name,food)) ''' zjx拿到了8000元的offer NameError: name 'eat' is not defined '''
3)函数不要自己调用自己
def get_money(date): print('去讨薪') get_money(date) print(get_money(8)) #死循环
2)函数不要相互调用
def get_money(date): print(date) get_name('yuz') def get_name(name): print(name) get_money(7)
二、函数的作用域
全局变量:整个文件都可以共用的,在函数体外面的
局部变量:在函数体这个局部里面
def add(a,b): c = a + b print('函数里面的c={}'.format(c)) return c c = 4 print('函数外面的c={}'.format(c)) add(5,8) ''' 函数外面的c=4 函数里面的c=13 '''
全局能获取局部变量吗?-------不能
全局能修改局部变量吗?--------不能
局部作用域能获取全局变量吗?--------能
局部作用域能修改全局变量吗?------能(前提是加global)
1) 全局作用域不能获取局部变量 defadd(a,b): c = a + b c += 5 return c c = 4 add(5,8) print(c) #4
2)局部作用域能获取全局变量 c = 8 def add(a,b): return a+b+c print(add(2,4)) # 14
3)局部作用域修改全局变量 c = 4 def add(a,b): global c c = c + 4 print(c) add(2,4) print('最后的c是{}'.format(c)) # 8
注意:不加global 表明是全局变量,局部是不能修改全局变量的
如果想在局部去修改全局变量,加global 表明这是一个全局变量
三、为什么要使用函数
当你发现你在复制粘贴相同的或者类似的代码的时候,那么,极有可能你需要定义一个函数,会把同样的一段代码存储到函数当中,这样的过程就是封装
封装成函数—》把一段代码存储到函数当中
函数的作用:存储一段程序(有长有短),为了重复利用,不需要复制粘贴了
四、内置函数
abs():返回数字的绝对值
dict():用于创建一个字典
min():返回给定参数的最小值,参数可以为序列
max():返回给定参数的最大值,参数可以为序列
sorted():对所有可迭代的对象进行排序操作
input():接收一个标准输入数据,返回为string类型
eval():用来进行一个字符串表达式,并返回表达式的值
int():用于将一个字符串或数字转换为整型
open():用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出OSError
str():将对象转化为适于人阅读的形式
bool():用于将给定参数转换为布尔类型,如果没有参数,返回False
sum():对序列进行求和计算
float():用于将整数和字符串转换成浮点数
print():用于打印输出,最常见的一个函数
tuple():将可迭代序列转换为元组
format():格式化字符串的函数,增强字符串格式化的功能
len():返回对象长度或项目个数
type():如果只有第一个参数则返回对象的类型,三个参数返回新的类型对象
list():用于将元组或字符串转换为列表
range():返回的是一个可迭代对象(类型是对象),而不是列表类型,所以打印的时候不会打印列表
set():创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等
enumerate():用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中
不是内置函数:isdigtal():检测字符串是否只由数字组成,返回为布尔类型
sort–排序,没有返回值,只是修改了原列表
lst = [1,4,7,2,9,8] new_lst = lst.sort() print(new_lst) #sort()函数没有返回值 print(lst) ''' None [1, 2, 4, 7, 8, 9] '''
sorted()返回的是一个新的列表,原列表没有变化
lst = [1,4,7,2,9,8] print(sorted(lst)) print(lst) ''' [1, 2, 4, 7, 8, 9] [1, 4, 7, 2, 9, 8] '''
enumerate() 枚举,可以同时获取索引和值,输出形式为元组
lst = [1,5,3,7,8,2] for i in enumerate(lst): print(i) ''' (0, 1) (1, 5) (2, 3) (3, 7) (4, 8) (5, 2) '''
enumerate() 枚举,可以用两个变量来接收
lst = [1,5,3,7,8,2] for i,v in enumerate(lst): #两个值就是元组的解包 print(i,v) ''' 0 1 1 5 2 3 3 7 4 8 5 2 '''
eval() 执行一个字符串表达式,并返回表达式的值
a = '1 + 2' print(a) print(eval(a)) ''' 1 + 2 3 '''