八、python函数调用/作用域

一、函数的相互调用

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
'''
原文地址:https://www.cnblogs.com/zhangjx2457/p/13628526.html