函数与过程
- 函数(function)是有返回值的,即是干完事必须写报告的苦逼
- 过程(procedure)是简单的、特殊并且没有返回值的,即是完事后拍屁股一走了之的小混蛋
- attention:Python严格来说只有函数没有过程
谈谈返回值
- 在许多编程语言中,我们说一个函数是整型函数是指这个函数会返回一个整型的返回值,而Python是动态的确定类型,只有在赋值时,编译器自动确定需要什么类型
- Python没有变量只有名字,即在Python中拿来即用就ok,并不用关注其是什么类型,包括其返回值,Python可以返回多个值
函数变量的作用域
变量的作用域即变量的可见性,即程序运行时变量可被访问的范围
局部变量(local variable)
- 如下代码中,price、rate、final_price,我们称之为discounts()函数里的局部变量
def discounts(price,rate):
final_price = price * rate
return final_price
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price,rate)
print('打折后的价格是:',new_price)
- 修改代码后,在函数外边打印局部变量final_price会报错,“final_price从来没有被定义过”,因为final_price只是一个局部变量,它的作用范围只在discounts这个函数里边生效,出了discounts函数范围,即在外边看不到final_price了
def discounts(price,rate):
final_price = price * rate
return final_price
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price,rate)
print('打折后的价格是:',new_price)
print('这里试图打印局部变量final_price的值:',final_price)#在函数外边打印局部变量final_price会报错
- 在函数里边定义的参数如上述的price、rate以及变量final_price,它们都称之为局部变量,出了定义的函数这些变量都是无效的
- 原理是Python在运行函数时,在调用这个函数时,它是利用栈stack进行存储,把函数所需要的代码以及变量都放在stack里边,当执行完该函数时,那么这个函数会被自动的删除,即stack的数据会自动清空,在函数外是无法访问到局部变量的。
全局变量(global variable)
- 在上述代码中,old_price、rate、new_price是定义在函数外的全局变量,全局变量拥有更大的作用域,它们的作用域是整个代码段
- 再次修改代码后,可以运行不会报错
def discounts(price,rate):
final_price = price * rate
print('这里试图打印全局变量old_price的值:',old_price)#看看全局变量可否再函数内
return final_price
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price,rate)
print('打折后的价格是:',new_price)
- 在Python里,可以在函数中肆无忌惮地访问一个全局变量,但是如果试图去修改一个全局变量,就有奇怪的事情发生
- 如果在函数内试图去修改全局变量的话,Python会自动创建一个新的局部变量代替,名字与全局变量一样,两者同时存在互不影响,因为两者的存储空间不一
def discounts(price,rate):
final_price = price * rate
# print('这里试图打印全局变量old_price的值:',old_price)
old_price = 50
print('修改后的old_price的值1是:',old_price)#新建的局部变量
return final_price
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price,rate)
print('修改后的old_price的值2是:',old_price)#原来的全局变量
print('打折后的价格是:',new_price)
- 全局变量在整个代码中都可以访问到,但不要试图在函数内部去修改它,可以在函数内部去访问它的值的不要去修改它,因为这样的话Python会自动在函数内部新建一个名字一样的局部变量代替
Task
0. 下边程序会输入什么?
def next():
print('我在next()函数里...')
pre()
def pre():
print('我在pre()函数里...')
next()
1. 请问以下这个函数有返回值吗?
>>> def hello():
print('Hello FishC!')
如果没有使用 return 语句指定返回值,Python 也不是什么都不返回的,Ta 会返回一个 None 对象,所以我们说 Python 所有的函数都有返回值
2. 请问 Python 的 return 语句可以返回多个不同类型的值吗?
可以的,以元组或列表形式返回
3. 目测以下程序会打印什么内容:
def fun(var):
var = 1314
print(var, end='')
var = 520
fun(var)
print(var)
4. 目测以下程序会打印什么内容?
var = ' Hi '
def fun1():
global var
var = ' Baby '
return fun2(var)
def fun2(var):
var += 'I love you'
fun3(var)
return var
def fun3(var):
var = ' 小甲鱼 '
print(fun1())
Baby I love you
5.编写一个函数,判断传入的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,既可顺读,也可倒读。例如:上海自来水来自海上)
程序执行结果如图:
my first code
def judge(string):
a = len(string)
counts = 0
for i in range(a):
if string[i] == string[a - 1 -i]:
counts += 1
if counts == a:
print('是回文联!')
else:
print('不是回文联!')
string1 = input('请输入一句话:')
judge(string1)
my improved code:巧用地板除法,避免判断重复,比如判断了第一位和最后一位的关系就不再判断最后一位与第一位的关系
def judge(string):
a = len(string)
counts = 0
for i in range(a // 2):# 巧用地板除法,避免判断重复,比如判断了第一位和最后一位的关系就不再判断最后一位与第一位的关系
if string[i] == string[a - 1 -i]:
counts += 1
if counts == a // 2:
print('是回文联!')
else:
print('不是回文联!')
string1 = input('请输入一句话:')
judge(string1)
小甲鱼1号代码:使用判断标准flag,学习学习!!!"
def palindrome(string):
length = len(string)
last = length-1 #最后一个字符串的索引值
length //= 2
flag = 1 # 此处flag用于判断,只要有一个不相等,flag就为0
for each in range(length):
if string[each] != string[last]:
flag = 0
last -= 1 # 从最后一个索引值开始往回倒
if flag == 1:
return 1
else:
return 0
string = input('请输入一句话:')
if palindrome(string) == 1:
print('是回文联!')
else:
print('不是回文联!')
小甲鱼2号代码:巧用reversed,学习学习!!!"
def palindrome(string):
list1 = list(string)
list2 = reversed(list1)
if list1 == list(list2):
return '是回文联!'
else:
return '不是回文联!'
print(palindrome('上海自来水来自海上'))
6. 编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数。
程序执行结果如图:
小甲鱼代码:
【1】多个参数是元组形式
【2】字符串的方法
【3】格式化字符串
def count(*params):#多个参数是以元组的形式
a = len(params)#参数的个数
for i in range(a):
letters = 0 #英文字母初始值为0
space = 0 #空格初始值为0
digit = 0 #数字初始值为0
others = 0
for each in params[i]:#一个参数一个参数地判断
if each.isalpha():
letters += 1
elif each.isspace():
space += 1
elif each.isdigit():
digit += 1
else:
others += 1
print('第 %d 个字符串共有:英文字母 %d 个,数字 %d 个,空格 %d 个,其他字符 %d 个。' % (i+1, letters, digit, space, others))