函数和过程
函数与过程其实是分开的,一般认为函数function是有返回值的,而过程procedure是简单,特殊且没有返回值的。
而在python中,严格来说是不存在过程的,只有函数,
>>> def hello():
print('hello~')
>>> print(hello())
hello~
None
为何会打印两行文字,在不写return语句的时候,默认python会认为函数是return none的,所以说python所有函数都是有返回值。
返回值
在其他编程语言环境下,我们说一个函数是整型的,是说函数会返回一个整型的返回值,但是在python中不会这样,python可以动态确定函数的类型,而且函数还能返回不同类型的值,还可以同时返回多个值。
>>> def network():
return ['hcia','hcip','hcie']
>>> network()
['hcia', 'hcip', 'hcie']
python也可以用列表打包多种类型的值一次性返回,也可以用元组的形式返回多个值。
函数变量的作用域
一般的编程语言都有局部变量与全局变量
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)
请输入原价:80
请输入折扣率:0.75
打折后的价格是: 60.0
此时,不论是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
print('这里试图打印局部变量final_price的值:',final_price)
执行到最后一句就会出错,这是因为final_price没有被定义过,也就是说python是找不到这个变量的,所以是一个局部变量,作用范围只会在discounts()函数的定义范围内。
总结:在函数里边定义的参数以及变量都成为局部变量,出了这个函数,这些变量就没用了。这是因为python在进行函数的时候,利用栈进行存储,当执行完函数的时候,函数中的所有数据都会被删除,所以函数外边是无法访问到函数内部的局部变量的。
而全局变量并没有此限制,即便是在函数内也可以使用,但是如果去修改了全局变量,就会使得程序发生异常?
def discounts(price,rate):
final_price = price * rate
old_price = 50 #这里试图修改全局变量
print('在局部变量中修改后old_price的值是: ',old_price)
return final_price
old_price = float(input('请输入原价: '))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price,rate)
print('全局变量old_price现在的值是:',old_price)
print('打折后价格是: ',new_price)
请输入原价: 80
请输入折扣率:0.75
在局部变量中修改后old_price的值是: 50
全局变量old_price现在的值是: 80.0
打折后价格是: 60.0
如果在函数内部试图修改全局变量,那么python会创建一个新的局部变量替代,名字与全局变量一致,但是真正的全局变量是不会改变的,所以程序没有出现意外。
课后题
1.下面的程序会输出什么?
def next():
print('我在next()函数里...')
pre()
def pre():
print('我在pre()函数里...')
next()
2.以下函数有返回值吗?
>>> def hello():
print('Hello FishC!')
3.请问python的return语句可以返回多个不同类型的值吗?
4.以下程序会打印什么内容?
def fun(var):
var = 1314
print(var, end='')
var = 520
fun(var)
print(var)
5.以下程序会打印什么内容?
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())
解:
1.我在next()函数里…
我在pre()函数里…
2.如果没有使用 return 语句指定返回值,Python 也不是什么都不返回的,Ta 会返回一个 None 对象,所以我们说 Python 所有的函数都有返回值。
3.可以的,以元组或者列表的形式
4.1314520
5. Baby I love you
动手题:
1.编写一个函数,判断传入的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,既可顺读,也可倒读。例如:上海自来水来自海上)
def palindrome(string):
list1 = list(string)
list2 = reversed(list1)
if list1 == list(list2):
return '是回文联!'
else:
return '不是回文联!'
print(palindrome('上海自来水来自海上'))
2.编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数。
def count(*param):
length = len(param)
for i in range(length):
letters = 0
space = 0
digit = 0
others = 0
for each in param[i]:
if each.isalpha():
letters += 1
elif each.isdigit():
digit += 1
elif each == ' ':
space += 1
else:
others += 1
print('第 %d 个字符串共有:英文字母 %d 个,数字 %d 个,空格 %d 个,其他字符 %d 个。' % (i+1, letters, digit, space, others))
count('I love fishc.com.', 'I love you, you love me.')