课时19:函数:我的地盘听我的

目录:

  一、函数和过程

  二、再谈谈返回值

  三、函数变量的作用域

  四、课时19课后习题及答案

******************

一、函数和过程

******************

Python严格来说,只有函数,没有过程。此话怎讲?

>>> def hello():
    print("DC love ZWW")

    
>>> hello()
DC love ZWW
>>> temp = hello()
DC love ZWW
>>> temp
>>> print(temp)
None
>>> print(hello())
DC love ZWW
None
>>> type(temp)
<class 'NoneType'>
>>> type(hello())
DC love ZWW
<class 'NoneType'>

调用print(hello())之后打印了两行字,第一行,我们知道时hello()函数执行的,第二行的None是怎么回事呢?当不写return语句的时候,默认Python会认为函数是return None的。所以说Python所有的函数都有返回值。

*********************

二、再谈谈返回值

*********************

在许多编程语言中,我们说一个函数是整型,其实我们的意思是指这个函数会返回一个整型的返回值。而Python不这么干,Python可以动态确定函数的类型,而且函数还能返回不同类型的值。还记得“Python只有变量,没有名字”这句话吗?只需知道Python会返回一个东西,然后拿来用就可以了。另外,Python似乎还可以同时返回多个值。

>>> def test():
    return [1,'小甲鱼',3.14]

>>> test()
[1, '小甲鱼', 3.14]

Python可以利用列表打包多种类型的值一次性返回。当然,也可以直接用元组的形式返回多个值:

>>> def test():
    return 1,'小甲鱼',3.14

>>> test()
(1, '小甲鱼', 3.14)

**************************

三、函数变量的作用域

**************************

 变量的作用域也就是平常所说的变量可见性,一般的编程语言都有局部变量和全局变量之分。分析以下代码:

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

来分析一下代码:在函数discounts()中,两个参数是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)

 程序走起,报错….

请输入原价:80
请输入折扣率:0.75
打折后价格是: 60.0
Traceback (most recent call last):
  File "C:Users14158Desktoplalallalalal.py", line 12, in <module>
    print('这里试图打印局部变量final_price的值:',final_price)
NameError: name 'final_price' is not defined

 错误原因:final_price没有被定义过,也就是说,python找不到final_price这个变量。这是因为final_price只是一个局部变量,它的作用范围只在它的地盘上—-discounts()函数的定义范围内—–有效,出了这个范围,就不再属于它的地盘了,它将什么都不是。

总结一下:在函数里边定义的参数以及变量,都称为局部变量,出了这个函数,这些变量都是无效的。事实上的原理是,Python在运行函数的时候,这里在调用这个函数的时候,利用栈进行存储,把函数里的变量代码都扔到栈里面去,当执行完该函数后,函数中的所有数据都会被自动删除。所以在函数外边是无法访问到函数内部的局部变量的。

与局部变量相对的全局变量,程序中old_price、new_price、rate都是在函数外边定义的,它们都是全局变量,全局变量拥有更大的作用域,例如,我们可以在函数中访问到它们:

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)

程序执行的结果如下:

请输入原价:80
请输入折扣率:0.75
这里试图打印全局变量old_price的值: 80.0
打折后价格是: 60.0

但是在使用全局变量时,要小心,注意一点:在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会创建一个新的局部变量代替(名字跟全局变量相同),但真正的全局变量是纹丝不动的,所以实现的结果和大家的预期不同。

关于全局变量,来进行下总结:全局变量在整个代码段中都是可以访问到的,但是不要试图在函数内部去修改全局变量的值,因为那样Python会自动在函数的内部创建一个名字一样的局部变量代替。

*******************************

四、课时19课后习题及答案

*******************************

运行结果:
我在next()函数里...
我再pre()函数里...

有返回值,返回值为none

可以。

1314520

我的代码:
def judge(inputs):
    mid = len(inputs) //2 + 1
    hwlian = True
    for each in range(0,mid):
        judge_char = (inputs[each] == inputs[(-each)-1])
        hwlian = hwlian and judge_char
    if hwlian:
        print(inputs,'是回文联!')
    else:
        print(inputs,'不是回文联!')

inputs = input('请输入需要确认的字符串:')
judge(inputs)

运行结果:
请输入需要确认的字符串:蒋婷是个
蒋婷是个 不是回文联!

请输入需要确认的字符串:上海自来水来自海上
上海自来水来自海上 是回文联!

请输入需要确认的字符串:啊哈哈啊
啊哈哈啊 是回文联!
小甲鱼代码:
def count(*params):
    length = len(params)
    for i in range(length):
        letters = 0
        space = 0
        digit = 0
        others = 0
        for each in params[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('this is jiangting 123445','zhangliang phone num: 13270')

运行结果:
第1个字符串共有:英文字母15个,数字6个,空格3个,其它0个
第2个字符串共有:英文字母18个,数字5个,空格3个,其它1个

0)善于使用内置函数,如list2 = list1.reverse()等等

1)关于收集参数的使用

收集参数传的是一个Tuple:
def count(*params):

intput_content = input('请输入字符串,多个字符串用“|||”分开:')
input_tuple = tuple(intput_content.split('|||'))
count('jiangting num : 123456','zhangliang num:456') #可以
count(input_tuple[0],input_tuple[1])                 #可以
count(input_tuple) #不可以传Tuple

可使用一个Tulple实参传形参
def count(params):   #将收集参数取消
intput_content = input('请输入字符串,多个字符串用“|||”分开:')
input_tuple = tuple(intput_content.split('|||'))
count(input_tuple)   #直接传tuple

2)关于全局变量的使用

发表回复