前言

上一节课我们基本介绍Python函数的用法,这一节课我们主要针对函数的参数进行进一步的深入学习。

知识点

  • 形参(parameter)和实参(argument)
>>> 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是叫形参
  • 关键字参数

    通常我们在调用一个函数时候,常常会搞乱参数的顺序以致达不到我们希望的效果。
def SaySome(name,words):
print(name + '->' + words) >>> SaySome('小甲鱼','让编程改变世界')
小甲鱼->让编程改变世界 >>> SaySome('让编程改变世界','小甲鱼')
让编程改变世界->小甲鱼 >>> SaySome(words='让编程改变世界',name = '小甲鱼')
小甲鱼->让编程改变世界
  • 默认参数

    定义了默认值的参数
>>> def SaySome(name='小甲鱼',words='让编程改变世界'):
print(name + '->' + words) >>> SaySome()
小甲鱼->让编程改变世界 >>> SaySome('苍井空')
苍井空->让编程改变世界
>>> SaySome('苍井空','fsfs')
苍井空->fsfs

收集参数(可变参数)

>>> def test(*params):
print('参数的长度是:',len(params));
print('第二个参数是:',params[1]); >>> test(1,'小甲鱼',3.14,5,6,7,8)
参数的长度是: 7
第二个参数是: 小甲鱼 >>> def test(*params,exp):
print('参数的长度是:',len(params));
print('第二个参数是:',params[1]); >>> test(1,'小甲鱼',3.14,5,6,7,8)
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
test(1,'小甲鱼',3.14,5,6,7,8)
TypeError: test() missing 1 required keyword-only argument: 'exp' >>> test(1,'小甲鱼',3.14,5,6,7,exp=8)
参数的长度是: 6
第二个参数是: 小甲鱼 >>> def test(*params,exp=8):
print('参数的长度是:',len(params));
print('第二个参数是:',params[1]); >>> test(1,'小甲鱼',3.14,5,6,7,8)
参数的长度是: 7
第二个参数是: 小甲鱼

课后习题

测试题

  • 请问以下哪个是行参哪个是实参?
def MyFun(x):
return x ** 3 y = 3
print(MyFun(y)) x是形式参数(行参),y是实际参数(实参)。
跟绝大部分编程语言一样,形参指的是函数创建和定义过程中小括号里的参数,
而实参指的是函数在调用过程中传递进去的参数。
  • 函数文档和直接用’#’为函数写注释有什么不同?

    给函数写文档是为了让别人可以更好的理解你的函数:
>>> def MyFirstFunction(name):
'函数文档在函数定义的最开头部分,用不记名字符串表示'
print('I love FishC.com!') >>> MyFirstFunction('fs')
I love FishC.com!

我们看到在函数开头写下的字符串Ta是不会打印出来的,但Ta会作为函数的一部分存储起来,这个我们称之为函数文档字符串,Ta的功能跟注释是一样的。

函数的文档字符串可以按如下方式进行访问:

>>> MyFirstFunction.__doc__
'函数文档在函数定义的最开头部分,用不记名字符串表示'

另外,我们用help()来访问这个函数也可以看到这个文档字符串:

>>> help(MyFirstFunction)
Help on function MyFirstFunction in module __main__: MyFirstFunction(name)
函数文档在函数定义的最开头部分,用不记名字符串表示
  • 使用关键字参数,可以避免什么问题的出现?

关键字参数,是指函数在调用的时候,带上参数的名字去指定具体调用的是哪个参数,从而可以不用按照参数的顺序调用参数,例如:

>>> def SaySome(name, words):
print(name + '->' + words) >>> SaySome(words='让编程改变世界!', name='小甲鱼')

使用关键字参数,可以有效避免因不小心搞乱参数的顺序导致的BUG出现。

  • 使用help(print)查看print()这个BIF有哪些默认参数?分别起到什么作用?
>>> 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.
# 文件类型对象,默认是sys.stdout(标准输出流)
sep: string inserted between values, default a space.
# 第一个参数如果有多个值(第一个参数是收集参数),各个值之间默认用空格(space)隔开
end: string appended after the last value, default a newline.
# 打印最后一个值之后默认参数一个新行标识符(‘\n’)
flush: whether to forcibly flush the stream.
# 是否强制刷新流
  • 默认参数和关键字参数表面最大区别是什么?

关键字参数是在调用的时候,通过参数名制定需要赋值的参数,这样做就不怕搞不清楚参数的顺序而导致函数调用出错。而默认参数是在参数定义的过程中,为形参赋初值,当函数调用的时候,不传递实参,则默认使用形参的初始值代替。

动动手

  • 编写一个符合以下要求的函数:

    1)计算打印所有参数的和乘以基数(base=3)的结果

    2)如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和计算。
def mFun(*param, base=3):
result = 0
for each in param:
result += each result *= base print('结果是:', result) mFun(1, 2, 3, 4, 5, base=5)
  • 寻找水仙花数

    题目要求:如果一个3位数等于其他各位数字的立方和,则称这个数为水仙花数。例如153=1^3 + 5^3 + 3^3,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。
def Narcissus():
for x in range(0,10):
for y in range(0,10):
for z in range(0,10):
sum = x*100 + y*10 +z
if x**3 + y**3 + z **3 == sum and sum>=100 and sum<1000:
print(sum, end='\t') print("所有的水仙花数分别是:", end='')
Narcissus() 或者 def Narcissus():
for each in range(100, 1000):
temp = each
sum = 0
while temp:
sum = sum + (temp%10) ** 3
temp = temp // 10 # 注意这里用地板除 if sum == each:
print(each, end='\t') print("所有的水仙花数分别是:", end='')
Narcissus() 运行结果:
================== RESTART: C:/Users/ThinkPad/Desktop/12.py ==================
所有的水仙花数分别是:153 370 371 407
  • 编写一个函数findstr(),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为“You cannot improve your past,but you can improve your future.Once time is wasted,life is wasted”

def findStr(x, subStr):
count = 0
length = len(x)
if subStr not in x:
print('在目标字符串中未找到字符串!')
else:
for each1 in range(length-1):
if x[each1] == subStr[0]:
if x[each1+1] == subStr[1]:
count += 1 print('子字符串在目标字符串中共出现 %d 次' % count) x = input('请输入目标字符串:')
subStr = input('请输入子字符串(两个字符):')
findStr(x, subStr)

零基础入门学习Python(18)--函数:灵活即强大的更多相关文章

  1. 【Python教程】《零基础入门学习Python》(小甲鱼)

    [Python教程]<零基础入门学习Python>(小甲鱼) 讲解通俗易懂,诙谐. 哈哈哈. https://www.bilibili.com/video/av27789609

  2. 《零基础入门学习Python》【第一版】视频课后答案第001讲

    测试题答案: 0. Python 是什么类型的语言? Python是脚本语言 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方 ...

  3. 零基础入门学习Python(1)--我和Python的第一次亲密接触

    前言 最近在学习Python编程语言,于是乎就在网上找资源.其中小甲鱼<零基础入门学习Python>试听了几节课,感觉还挺不错,里面的视频都是免费下载,小甲鱼讲话也挺幽默风趣的,所以呢,就 ...

  4. 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案

    国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...

  5. 学习《零基础入门学习Python》电子书PDF+笔记+课后题及答案

    初学python入门建议学习<零基础入门学习Python>.适合新手入门,很简单很易懂.前一半将语法,后一半讲了实际的应用. Python3入门必备,小甲鱼手把手教授Python,包含电子 ...

  6. 零基础入门学习Python(17)--函数:Python的乐高积木

    前言 相信大家小时候都玩过神奇的乐高积木, 只要通过想象力和创造力我们可以拼凑很多神奇的东西,那么随着我们学习的深入,我们编写的Python代码也将日益增加,并且也越来越复杂, 所以呢,我们需要找寻一 ...

  7. 零基础入门学习Python(20)--函数:内嵌函数和闭包

    知识点 global关键字 使用global关键字,可以修改全局变量: >>> count = 5 >>> def Myfun(): count = 10 prin ...

  8. 零基础入门学习Python(36)--类和对象:给大家介绍对象

    知识点 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前 ...

  9. 零基础入门学习Python(21)--函数:lambda表达式

    知识点 lambda 表达式 Python 允许使用lambda关键字创建匿名函数 lambda 函数怎么使用? 单个参数 >>> def add(x): return 2*x + ...

随机推荐

  1. Thinkpad x230i安装Ubuntu10.04发生no network devices available

    这个是由于10.04版本没有集成x230i的网卡驱动导致,需要到http://sourceforge.net/projects/e1000/f ... %20stable/下载最新版本驱动,并安装,之 ...

  2. J20170520-ts

    手取り   净收入,实收额;用手抓住,到手

  3. python 面向对象八 多继承

    python是支持多继承的,在设计类的继承关系时,通常,主线都是单一继承下来的.但是,如果需要“混入”额外的功能,通过多重继承就可以实现,这种设计通常称之为MixIn. 为了更好地看出继承关系,以Mi ...

  4. SpringMVC分页查询无法直接将对象转换成json的解决办法(报org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type:错)

    在用ajax获得分页数据时,无法将获取的值赋值给input标签,在修改用户信息时不显示用户已经注册的信息,百度可知 springmvc处理分页数据返回的对象时,无法直接将对象转换成json,会报org ...

  5. (转载)Python一篇学会多线程

    Python 一篇学会多线程 链接:https://www.cnblogs.com/yeayee/p/4952022.html  多线程和多进程是什么自行google补脑,廖雪峰官网也有,但是不够简洁 ...

  6. Unix\Linux | 总结笔记 | vi编辑器

    0 目录   新建文件夹   常用的命令    三种模式及切换    vi编辑器的启动选项及后续相关操作  其他--替换文本  其他--写入另一个文件     1  新建文件夹  vi [目录名/文件 ...

  7. [HNOI2008]Card洗牌

    Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...

  8. [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...

  9. ACM_查找ACM(加强版)

    查找ACM(加强版) Time Limit: 2000/1000ms (Java/Others) Problem Description: 作为一个acmer,应该具备团队合作能力和分析问题能力.给你 ...

  10. C. Dasha and Password 预处理 + dp

    http://codeforces.com/contest/761/problem/C 对于每一个字符串,可以预处理出其到达数字,字母,和特殊符号所需的最小步数. 然后就是在n个东西中,选出数字.字母 ...