17 函数:Python的乐高积木



一、创建一个函数

>>> def MyFirstFunction():print('这是我创建的第一个函数!')print('我表示很鸡冻....')print('在此,我要感谢TVB,感谢CCTV,感谢小甲鱼,感谢泉泉,感谢我对象...')

二、调用一个函数

>>> MyFirstFunction()
这是我创建的第一个函数!
我表示很鸡冻....
在此,我要感谢TVB,感谢CCTV,感谢小甲鱼,感谢泉泉,感谢我对象...

三、函数的实现原理(运行机制):

        调用函数是,Python会往上寻找,找到【def】创建和定义内容↓

【存在问题】如果只是单纯的定义函数,效率还不如 for while 高。故...


四、创建一个带参数的函数

例①:

>>> def MyFirstFunction(name):print(name + '我爱你')
>>> MyFirstFunction()Traceback (most recent call last):File "<pyshell#8>", line 1, in <module>MyFirstFunction()
TypeError: MyFirstFunction() missing 1 required positional argument: 'name''''提示需要一个‘name’的参数'''
>>> def MyFirstFunction(name):print(name + '我爱你')>>> MyFirstFunction('金小川')
金小川我爱你

例②:

>>> def add(num1, num2):    result = num1 + num2print(result)>>> add(1, 2)
3

五、函数的返回值  __return()

以上个例子为例,改成:

>>> add(1, 2)
3
>>> def add(num1, num2):return(num1 + num2)>>> print(add(1, 2))
3

18 函数:灵活即强大



一、形参(parameter)和实参(argument)

例:

>>> def MyFirstFunction(name):print(name + '我爱你')      '''name为形参'''>>> MyFirstFunction('金小川')   '''金小川 为实参'''
金小川我爱你

二、函数文档

>>> def MyFirstFunction(name):'函数定义过程中的name叫做形参'#因为Ta只是一个形式,表示占据一个参数位置print('传递进来的【' + name + '】叫做实参,因为Ta是具体的参数值!')>>> MyFirstFunction('金小川')
传递进来的【金小川】叫做实参,因为Ta是具体的参数值!>>> MyFirstFunction.__doc__
'函数定义过程中的name叫做形参'>>> help(MyFirstFunction)
Help on function MyFirstFunction in module __main__:MyFirstFunction(name)函数定义过程中的name叫做形参

【拓展】关于函数文档,到底用什么导出?【help】 or  【__doc__】 

>>> print.__doc__
"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\nPrints the values to a stream, or to sys.stdout by default.\nOptional keyword arguments:\nfile:  a file-like object (stream); defaults to the current sys.stdout.\nsep:   string inserted between values, default a space.\nend:   string appended after the last value, default a newline.\nflush: whether to forcibly flush the stream.">>> help(print)
Help on built-in function print in module builtins:print(...)print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)Prints the values to a stream, or to sys.stdout by default.Optional keyword arguments:file:  a file-like object (stream); defaults to the current sys.stdout.sep:   string inserted between values, default a space.end:   string appended after the last value, default a newline.flush: whether to forcibly flush the stream.

        显然是  __help()


三、关键字参数

>>> def SaySome(name, words):print(name + '—>' + words)>>> SaySome('李旭冉', '爱金小川!!')
李旭冉—>爱金小川!!

【存在问题】如果不小心把顺序搞混了:

>>> SaySome( '爱金小川!!', '李旭冉')
爱金小川!!—>李旭冉

【问题】那这个结果就不是我们想要的。
【解决方法】关键字参数:

>>> SaySome( words = '爱金小川!!', name = '李旭冉')
李旭冉—>爱金小川!!

四、默认参数

>>> def SaySome(name='李旭冉', words='爱金小川!!'):print(name + '—>' + words)>>> SaySome()
李旭冉—>爱金小川!!

【疑问】这里没有输入参数,使用的是默认值。那如果输入参数会怎么样?

>>> def SaySome(name='李旭冉', words='爱金小川!!'):print(name + '—>' + words)>>> SaySome('李旭冉', '爱李旭冉的男朋友')
李旭冉—>爱李旭冉的男朋友

作用:默认参数是在参数定义的过程中,为形参赋初值;当函数调用的时候,如果忘记传递参数,函数就会自动去找默认值


五、收集参数(可变参数)

                __适用于当作者也搞不清楚函数到底有几个参数时。
                    此时只需要在参数面前加个星号即可。

>>> def test(*params):print('参数的长度是:', len(params))print('第二个参数是', params[1])print('第三个参数是', params[2])print('第...太累啦,不写啦')>>> test(1, 'lxr', 4.3, 'jxc', '523', 6.66, 4,17, 6.01)
参数的长度是: 9
第二个参数是 lxr
第三个参数是 4.3
第...太累啦,不写啦

【注意】如果定义函数时,除了收集参数,还有其他的参数,记得用关键字参数!!
               否则:

>>> def test(*params, exp):print('参数的长度是:', len(params), exp)print('第二个参数是', params[1])>>> test(1, 'lxr', 4.3, 'jxc', '523', 4,17, 6.01)
Traceback (most recent call last):File "<pyshell#56>", line 1, in <module>test(1, 'lxr', 4.3, 'jxc', '523', 4,17, 6.01)
TypeError: test() missing 1 required keyword-only argument: 'exp'

【原因分析】没用关键字参数,系统默认把元组中的所有数都分给了收集参数,
                      故其他参数(exp)无效。

【解决方法①】关键字参数

>>> def test(*params, exp):print('参数的长度是:', len(params), exp)print('第二个参数是', params[1])>>> test(1, 'lxr', 4.3, 'jxc', '523', 4,17, exp = 6.01)
参数的长度是: 7 6.01
第二个参数是 lxr

【解决方法②】默认参数

>>> def test(*params, exp = 6.01):print('参数的长度是:', len(params), exp)print('第二个参数是', params[1])>>> test(1, 'lxr', 4.3, 'jxc', '523', 4,17)
参数的长度是: 7 6.01
第二个参数是 lxr

19 函数:我的地盘听我的



一、函数没有过程

>>> def hello():print('hello chuan!')>>> temp = hello()
hello chuan!
>>> temp
>>> type(temp)
<class 'NoneType'>

【解释】hello()没有返回值,故访问【temp】时,没有返回值;即使没有用“return”给
             【temp】返回值,【temp】也不是什么都没有,而是可以返回【None】



二、Python的返回值

>>> def back():return[1.2, '钏', 521]>>> back()
[1.2, '钏', 521]
>>>
>>> def back():return 1.2, '钏', 521>>> back()
(1.2, '钏', 521)

【解释】返回值很灵活,可以是列表,也可以是元组。



三、局部变量(Local VAriable)和全局变量(Global Variable)

(一)局部变量(Local VAriable)

def discounts(price, rate):final_price = price * ratereturn final_priceold_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price, rate)
print('打折后的价格是:', new_price)
================================
请输入原价:100
请输入折扣率:0.7
打折后的价格是: 70.0

        【】正常运行


def discounts(price, rate):final_price = price * ratereturn final_price
print('这里试图打印局部变量final_price的值:', final_price)old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price, rate)
print('打折后的价格是:', new_price)
================================
请输入原价:100
请输入折扣率:0.7
打折后的价格是: 70.0
Traceback (most recent call last):File "C:/Users/86199/Desktop/小甲鱼c/111.py", line 9, in <module>print('这里试图打印局部变量final_price的值:', final_price)
NameError: name 'final_price' is not defined

Traceback (most recent call last):
          File "C:/Users/86199/Desktop/小甲鱼c/111.py", line 9, in <module>
            print('这里试图打印局部变量final_price的值:', final_price)
        NameError: name 'final_price' is not defined

【解析】因为【final_price】是局部变量,只可以在他所在的部分起作用(final_price在定义函数范围内),出了他所在范围,则不存在该变量。


(二)全局变量(Global Variable)

        【尝试】在函数内打印全局变量

def discounts(price, rate):final_price = price * rateprint('这里试图打印全局变量odl_price的值:', old_price)return final_priceold_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price, rate)
print('打折后的价格是:', new_price)================================
请输入原价:100
请输入折扣率:0.7
这里试图打印全局变量odl_price的值: 100.0
打折后的价格是: 70.0

 【结果】可以打印!!


 【尝试】在函数内修改全局变量

def discounts(price, rate):final_price = price * rate#  print('这里试图打印全局变量odl_price的值:', old_price)old_price = 50print('①修改后old_price的值是:', old_price)return final_priceold_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price, rate)
print('②修改后old_price的值是:', old_price)
print('打折后的价格是:', new_price)================================
请输入原价:100
请输入折扣率:0.7
①修改后old_price的值是: 50
②修改后old_price的值是: 100.0
打折后的价格是: 70.0

【问题】
        1、old_price并没有因为函数内的修改而变化;
        2、①成功修改了,但是②并没有成功修改。

【解析】如果在函数内试图修改一个全局变量,那么Python就会在函数内创建一个同名局部
               变量代替(shadowing)。二者同名,但互不影响。

再举个例子:

>>> count = 5
>>> def MyFun():count = 10print(count)>>> MyFun()
10
>>> print(count)
5

【总结】

全局变量在全局都可以被访问到。但是在函数内部,只可以访问,不可以修改。

17~19 函数(上)相关推荐

  1. 《JavaScript应用程序设计》一一2.17 回调函数

    本节书摘来华章计算机出版社<JavaScript应用程序设计>一书中的第2章,第2.17节,作者:Eric Elliott 更多章节内容可以访问云栖社区"华章计算机"公 ...

  2. 信息学奥赛一本通 2050:【例5.20】字串包含 | OpenJudge NOI 1.17 19:字符串移位包含问题

    [题目链接] ybt 2050:[例5.20]字串包含 OpenJudge NOI 1.17 19:字符串移位包含问题 [题目考点] 1. 字符串 2. 判断一个字符串是不是另一个字符串的子串(字符串 ...

  3. 2018开春大礼:750页电子书 + 33场技术沙龙资料 + 17场线上课程分享

    2017年,美团成长为中国领先的生活服务电子商务平台,在吃喝玩乐住行等200多个品类,2800多个城区县,服务了亿万消费者.数百万商家,日订单数超过2200万,年度交易总额达到了3600亿.2017年 ...

  4. 算法题:将生成1-5随机数函数转换为1-7随机数函数

    题目 将生成1-5随机数函数转换为1-7随机数函数. 解法 方法一 简单的说, 把 1-5 的随机数发生器用两次, 拼成一个5进制的数, 就是1-25. 将这 1-25 平均分配的25种情况映射到7种 ...

  5. 使用WPA Supplicant在Ubuntu 18.04/19.04上从终端连接到Wi-Fi的方法

    使用WPA Supplicant在Ubuntu 18.04/19.04上从终端连接到Wi-Fi的方法_Linux教程_云网牛站 (ywnz.com) 本文介绍使用wpa_supplicant从Ubun ...

  6. 把多个JavaScript函数绑定到onload事件处理函数上

    为了让函数只在页面加载完毕后才得到执行,我们会把函数绑定到onload事件上: window.onload = userFunction 但如果有两个函数:firstFunction() 和 seco ...

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

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

  8. static不应在文件范围内定义的成员函数上使用

    转自: http://zhidao.baidu.com/link?url=3cG_RJDfBQnzKzhnKaoL4wTkT_C0JDmdn0MH4eSPDe9clrnR4d1iJkYxWm88Z2Q ...

  9. C++使用static的错误:无法解析的外部符号、“static”不应在文件范围内定义的成员函数上使用

    // static_test.h : 头文件 002 #pragma once 003 004 class static_test 005 { 006 public: 007 static_test( ...

最新文章

  1. 安装华为T2000软件,无法初始化MS SQL 2000问题解决办法
  2. 浅析网站SEO优化用户体验值包括什么后续又该如何进行提升?
  3. MySQL对JSON类型UTF-8编码导致中文乱码探讨
  4. 《从零开始学ASP.NET CORE MVC》课程介绍
  5. shell变量的使用
  6. 【重点】剑指offer——面试题65:滑动窗口的最大值
  7. 五大地形等高线特征_等高线顺口溜如何判别等值线的高度
  8. 中国历史上成功的两人合作, 改进, 提高的例子
  9. 024 幂函数、指数函数、对数函数导数公式推导
  10. Linux数独小游戏C语言,C语言数独游戏的求解方法
  11. 通过温度湿度计算露点
  12. 12个用一条语句写成的有关日期函数
  13. 30分钟java桌球小游戏,30分钟完成桌球小游戏项目
  14. 【问链-区块链基础知识系列】 第十二课 区块链产业落地现状分析
  15. PCIe 分类、速度
  16. 【自然语言处理】【检索】GENER:自回归实体检索
  17. 阿里升级多项员工福利:7天全薪陪伴假、可灵活办公
  18. 《LaneAF:Robust Multi-Lane Detection with Affinity Fields》论文笔记
  19. CortexM3与M4寄存器学习笔记
  20. 2017年工作目标与生活规划

热门文章

  1. 软件初始化失败解决办法
  2. SpringCloud Stream多源的使用
  3. 清华大学计算机系刘斌,清华大学计算机科学与技术系导师简介:林闯
  4. Python的几句经典口号
  5. pinia的学习和理解
  6. 腾讯云发布云端开发者工具Cloud Studio 帮助开发者实现一站式开发(内含福利)
  7. C语言第13课——文件读写
  8. SDCC 2015中国软件开发者大会盛大开幕
  9. Python:实现sobel边缘检测算法(附完整源码)
  10. Day 250/300 《图解HTTP》读书笔记(二)