一、函数和过程

Python只有函数,没有过程

>>> def hello():print('hello world')
>>> hello()
hello world
>>> temp = hello()
hello world
>>> temp
>>>
>>> print(temp)
None
>>> type(temp)<class 'NoneType'>

从上面这个例子看出,当没有return返回值的时候,打印函数hello()的时候输出none。也就是默认Python会认为函数是return none的。所以所有的函数都有返回值

二、函数的返回值

Python不指定数据类型,它可以动态确定函数的类型,函数还能返回不同类型的值。Python只有变量,没有名字

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

>>> def back():return [1,'晴天',3.14,2]
>>> back()
[1, '晴天', 3.14, 2]>>> def back():return 1,'晴天',3.14,2
>>> back()
(1, '晴天', 3.14, 2)

三、函数变量的作用域

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

def discounts(price,rate):#括号里面的两个参数是局部变量final_price = price * rate#局部变量return final_priceold_price = float(input('请输入原价:'))#全局变量
rate = float(input('请输入折扣率:'))#全局变量
new_price = discounts(old_price,rate)#全局变量
print('打折后价格是:',new_price)

运行结果:

请输入原价:100
请输入折扣率:0.9
打折后价格是: 90.0

第一次尝试:我把final_price放在外面打印出来。程序报错:final_price没有被定义过,也就是说,python找不到final_price这个变量。这是因为final_price只是一个局部变量,它的作用范围只在它的地盘上----discounts()函数的定义范围内-----有效,出了这个范围,就不再属于它的地盘了,它将什么都不是。

请输入原价:100
请输入折扣率:0.9
打折后价格是: 90.0
Traceback (most recent call last):File "C:/Users/ZPWX/AppData/Local/Programs/Python/Python37/源码/note1.py", line 10, in <module>print('这里试图打印final_price的值',final_price)
NameError: name 'final_price' is not defined

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

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

def discounts(price,rate):#括号里面的两个参数是局部变量final_price = price * rate#局部变量print('这里试图打印old_price的值:',old_price)return final_priceold_price = float(input('请输入原价:'))#全局变量
rate = float(input('请输入折扣率:'))#全局变量
new_price = discounts(old_price,rate)#全局变量
print('打折后价格是:',new_price)

运行结果:

请输入原价:100
请输入折扣率:0.9
这里试图打印old_price的值: 100.0
打折后价格是: 90.0

但是在使用全局变量时,要小心,注意一点:在Python中,你可以在函数中肆无忌惮地访问一个全局变量,但如果你试图去修改它,就会有奇怪的事情发生。分析以下的代码:

def discounts(price,rate):#括号里面的两个参数是局部变量final_price = price * rate#局部变量old_price = 50 #在这里是局部变量print('修改后的old_price的值1是:',old_price)return final_priceold_price = float(input('请输入原价:'))#全局变量
rate = float(input('请输入折扣率:'))#全局变量
new_price = discounts(old_price,rate)#全局变量
print('打折后价格是:',new_price)
print('修改后的old_price的值2是:',old_price)

运行结果:

请输入原价:100
请输入折扣率:0.9
修改后的old_price的值1是: 50
打折后价格是: 90.0
修改后的old_price的值2是: 100.0

如果在函数内部试图修改全局变量,那么Python会创建一个新的局部变量代替(名字跟全局变量相同),但真正的全局变量是纹丝不动的,所以实现的结果和大家的预期不同。

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

四、课后题

测试题:
      
0. 下边程序会输入什么?

  1. def next():
  2. print('我在next()函数里...')
  3. pre()
  4. def pre():
  5. print('我在pre()函数里...')
  6. next()

输出:

我在next()函数里...
我在pre()函数里...

1. 请问以下这个函数有返回值吗?

  1. >>> def hello():
  2. print('Hello FishC!')

答:有。 会返回一个None的对象
如果没有使用return语句指定返回值,Python也不是什么都不返回的,Ta会返回一个None对象,所以我们说Python所有的函数都有返回值。

2. 请问Python的return语句可以返回多个不同类型的值吗?
答:可以。Python可以利用列表打包多种类型的值一次性返回。当然,也可以直接用元组的形式返回多个值

3. 目测以下程序会打印什么内容:

  1. def fun(var):
  2. var = 1314
  3. print(var, end='')
  4. var = 520
  5. fun(var)
  6. print(var)

答案:1314520

4. 目测以下程序会打印什么内容?

  1. var = ' Hi '
  2. def fun1():
  3. global var
  4. var = ' Baby '
  5. return fun2(var)
  6. def fun2(var):
  7. var += 'I love you'
  8. fun3(var)
  9. return var
  10. def fun3(var):
  11. var = ' 小甲鱼 '
  12. print(fun1())

答案:打印:Baby I love you

总结:建议不到万不得已不要使用全局变量,简洁的概括为:
    a) 代码可读性变差
    b) 代码安全性降低

以下关于全局变量的危言耸听是转来的,大家不妨也看下:

a) 它会造成不必要的常量频繁使用,特别当这个常量没有用宏定义“正名”时,代码阅读起来将万分吃力。
    
    b) 它会导致软件分层的不合理,全局变量相当于一条快捷通道,它容易使程序员模糊了“设备层”和“应用层”之间的边界。写出来的底层程序容易自作多情地关注起上层的应用。这在软件系统的构建初期的确效率很高,功能调试进度一日千里,但到了后期往往bug一堆,处处“补丁”,雷区遍布。说是度日如年举步维艰也不为过。

c) 由于软件的分层不合理,到了后期维护,哪怕仅是增加修改删除小功能,往往要从上到下掘地三尺地修改,涉及大多数模块,而原有的代码注释却忘了更新修改,这个时候,交给后来维护者的系统会越来越像一个“泥潭”,注释的唯一作用只是使泥潭上方再加一些迷烟瘴气。

d) 全局变量大量使用,少不了有些变量流连忘返于中断与主回圈程序之间。这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏肓的特征来了,没有大牛来力挽狂澜,注定慢性死亡。

e) 无需多言,如果您的系统中大量使用全局变量,那么您已经成功得到一个畸形的系统,它处于一个神秘的稳定状态!你看着这台机器,机器也看着你,相对无言,心中发毛。你不确定它什么时候会崩溃,也不晓得下一次投诉什么时候道理。

动动手:
     
0. 编写一个函数,判断传入的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,既可顺读,也可倒读。例如:上海自来水来自海上)

答案:

def palindrome(string):length = len(string)last = length - 1length //= 2flag = 0for each in range(length):if string[each] == string[last]:flag = 1last -= 1else:flag = 0if flag == 1:return 1else:return 0string = input('请输入一句话:')
if palindrome(string) == 1:print('是回文联')
else:print('不是回文联')

总结:1.上面的string是局部变量,下面的string是全局变量

2.在这里的关键是length //= 2,string是字符串,要判断string【each】==string【last】

3.要善于在编程里用flag标志

1. 编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数。
程序执行结果如图:
  

def count(*param):length = len(param)for i in range(length):letters = 0digits = 0space = 0others = 0for each in param[1]:if each.isalpha():letters += 1elif each.isdigit():digits += 1elif each == ' ':space += 1else:others += 1print('第%d个字符串共有:英文字母%d个,数字%d个,空格%d个,其他字符%d个。'%(i+1,letters,digits,space,others))count('i love python','i am a student')

运行结果:

总结:0.这道题的思路是先取出一个字符串,然后查找这个字符串有几个字母,几个数字或者其他的

1.会用格式化操作符%,字符串的一些内置方法

课时19 函数:我的地盘听我的相关推荐

  1. Python第019讲课后测试题:函数-我的地盘听我的

    函数-我的地盘听我的 测试题: 0. 下边程序会输入什么? def next():print('我在next()函数里...')pre()def pre():print('我在pre()函数里...' ...

  2. 函数:我的地盘听我的+习题复习

    ##函数与过程            ※函数(function):有返回值            ※过程(procedure):是简单的,特殊并且没有返回值的             (python严 ...

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

    目录: 一.函数和过程 二.再谈谈返回值 三.函数变量的作用域 四.课时19课后习题及答案 ****************** 一.函数和过程 ****************** Python严格 ...

  4. 019函数:我的地盘听我的

    019函数:我的地盘听我的 一.函数与过程 过程procedure:简单.特殊并且没有返回值的 >>> def hello():print('Hello xx') >>& ...

  5. 第019讲:函数:我的地盘听我的

    测试题 0. 下边程序会输入什么? def next():print('我在next()函数里...')pre()def pre():print('我在pre()函数里...')>>> ...

  6. 17~19 函数(上)

    17 函数:Python的乐高积木 一.创建一个函数 >>> def MyFirstFunction():print('这是我创建的第一个函数!')print('我表示很鸡冻.... ...

  7. 笨方法学习Python 习题19 函数和变量 ---学习记录

    习题19 函数和变量 #定义cheese_and_crackers函数,参数有括号里的俩 def cheese_and_crackers(cheese_count,boxes_of_crackers) ...

  8. FishC笔记—19 讲 函数:我的地盘听我的

    本期内容详解: 1.函数与过程:过程(procedure)是简单的,特殊且没有返回值的:函数(Function)有返回值 Python严格来说只有函数没有过程 2.局部变量:在局部生效如在函数中定义的 ...

  9. 零基础入门学习Python(19)--函数:我的地盘听我的

    知识点 函数与过程 在许多编程语言中,函数(function)是有返回值的,过程(procedure)是简单.特殊并且没有返回值的.而在Python中,严格来说只有函数没有过程. 例如: >&g ...

最新文章

  1. 脑电分析系列 | eeglab汇总
  2. python compileall 打包发布
  3. shell 停止tomcat_Linux停止tomcat运行
  4. Flutter中ListView加载图片数据的优化
  5. struts2 国际化资源文件自定义的路径解决方法
  6. python 语法提示_Python 语法提示vim配置
  7. 矩阵论16 17 18 19
  8. Jdk(1.6和1.8)中英文Api文档
  9. Blender全新毛发工具演示露出,预计9月份正式更新
  10. Matlab的复共轭转置
  11. ISO_IEC_27003:2017信息安全管理体系中文解读
  12. 乐优商场项目day08——图片(文件)上传
  13. Dynamic Web TWAIN:网页扫描过程中如何自动检测和删除空白页?
  14. macbook 打开多个终端
  15. 荣耀magicbookpro升级鸿蒙,荣耀MagicBook Pro 2020到底好不好?答案就在这里
  16. 隔离变压器不触电原因
  17. Android高手笔记 - 卡顿优化
  18. 猜数游戏(人机交互)
  19. 机器人轨迹规划(熊友伦)
  20. 微信小程序请求java后台 springmvc 获取json

热门文章

  1. 中天网景亮相2021高交会,携5大解决方案构建物联网数字化底座
  2. Springboot整合squirrel-foundation状态机
  3. 国产操作系统-中标麒麟
  4. 193884-53-6,APS-5,9-(4-氯苯硫代磷酰氧亚甲基)-10-甲基二氢吖啶二钠盐作为发光探针被用于基因芯片的研究中
  5. 项目管理流程包含哪些
  6. 2020上半年勒索病毒报告:勒索手段升级,不交赎金就公开数据
  7. Collection 斗地主游戏
  8. 如何用计算机做样本抽样,抽样的四种基本方法
  9. vnc viewer中文版,3步下载vnc viewer中文版
  10. WRF模式的安装与运行