第十八课:函数:灵活即强大

内容来源于网络,本人只是在此稍作整理,如有涉及版权问题,归小甲鱼官方所有。

练习题(来自小甲鱼官方论坛)

0.请问以下哪个是形参哪个是实参?

def MyFun(x):
    return x ** 3

y = 3
print(MyFun(y))

答:x是形参,y是实参。跟绝大部分编程语言一样,形参指的是函数创建和定义过程中小括号里的参数,而实参指的是函数在调用过程中传递进去的参数。


1. 函数文档和直接用“#”为函数写注释有什么不同?

答:给函数写文档是为了让别人可以更好的理解你的函数,所以这是一个好习惯:

>>> def Add(x,y):
    'add two numbers'
    return x+y

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

函数的文档字符串可以按如下方式访问:
>>> Add.__doc__
'add two numbers'

另外,我们用help()来访问这个函数也可以看到这个文档字符串:
>>> help(Add)
Help on function Add in module __main__:

Add(x, y)
    add two numbers

>>> 

2. 使用关键字参数,可以有效避免什么问题的出现呢?

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

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

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


3. 使用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.
    # 是否强制刷新流

4. 默认参数和关键字参数表面最大的区别是什么?

答:默认参数是赋予形式参数默认值,关键字参数是使得实际参数与形参相对应而避免顺序错误引发的系统报错。
关键字参数是在函数调用的时候,通过参数名制定需要赋值的参数,这样做就不怕因为搞不清参数的顺序而导致函数调用出错。而默认参数是在参数定义的过程中,为形参赋初值,当函数调用的时候,不传递实参,则默认使用形参的初始值代替。


编程题

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

a) 计算打印所有参数的和乘以基数(base=3)的结果
b) 如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和计算。
答:

def Sum(*params,base=3):
    result = 0
    for i in params:
        result += i
    result *= base

    print('结果是:', result)

Sum(1, 2, 3, 4, 5)
Sum(1, 2, 3, 4, 5, base=5)

输出:
结果是: 45
结果是: 75

1. 寻找水仙花数

题目要求:如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如153 = 1^3+5^3+3^3,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。
答:

#第一种方法:
def Daffodils():
    print('所有的水仙花数为:',end='')
    temp = 100
    while temp < 1000:
        if temp == (temp//100)**3 + ((temp%100)//10)**3 + (temp%10)**3:
            print(temp,end=' ')
            temp += 1
        else:
            temp += 1

Daffodils()
#第二种方法(更好):
def Nacissus():
    print('所有的水仙花数为:',end='')
    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='  ')

Nacissus()
#第三种方法:一行代码
a = [i**3+j**3+k**3 for i in range(1, 10) for j in range(0, 10) for k in range(0, 10) if i*100+j*10+k == i**3+j**3+k**3]
print(a)

2. 编写一个函数findstr(),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为"You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.",子字符串为"im",函数执行后打印“子字母串在目标字符串中共出现3次”。

答:

#第一种方法
def findstr():
    print('请输入目标字符串:',end='')
    temp = input()
    print('请输入子字符串(两个字符):',end='')
    comp = input()
    count = 0
    i = 0
    for i in range(len(temp)):
        if temp[i] == comp[0] and temp[i+1] == comp[1]:
            count += 1
            i += 1
        else:
            i += 1
    count = int(count)
    print('子字符串在目标字符串中总共出现 %d 次'%count)
findstr()
#第二种方法:不管大小写
def findStr(desStr, subStr):
    count = 0
    length = len(desStr)
    if subStr not in desStr:
        print('在目标字符串中未找到字符串!')
    else:
        for each1 in range(length):      
            if desStr[each1].upper() == subStr[0].upper():
                if desStr[each1+1].upper() == subStr[1].upper():
                    count += 1
                    
        print('子字符串在目标字符串中共出现 %d 次' % count)
 
desStr = input('请输入目标字符串:')
subStr = input('请输入子字符串(两个字符):')
findStr(desStr, subStr)

3.请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

  • 分清楚形参和实参
  • 函数文档:是函数的一部分,与解释不同,使用help(函数名)或者 函数名____doc_____(前后分别两个下划线)可以查看到
  • 关键字参数(在一个函数的参数较多的时候作用比较明显):
    给参数的名字下定义,例如:
    def F(name,words)
    如下两种引用的方法是等价的
    F(A,B) = F(words=B,name=A)
  • 默认参数:函数定义时为形参赋初值,函数调用时若没有传递参数,则自动使用初值
  • 收集参数(可变参数):
# *来打包(列表)
>>> def test(*params,extra):
    print("收集参数是:",params)
    print("位置参数是:",extra)

>>> test(1, 2, 3, 4, 5, 6, 7, extra = 8)
收集参数是: (1, 2, 3, 4, 5, 6, 7)
位置参数是: 8
# **来打包(字典)
def test(**dicts):
    print("收集参数是:", dicts)

test(a = 1, b = 2)
输出:
收集参数是: {'a': 1, 'b': 2}
# *来解包
>>> def test(*params):
    print("有 %d 个参数" % len(params))
    print("第二个参数是:",params[1])
    
>>> a = [1, 2, 3, 4, 5, 6, 7, 8]
>>> test(*a)  # 实参前面加上星号表示解包,不加报错
有 8 个参数
第二个参数是: 2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,543评论 0 5
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,928评论 17 410
  • 【中国夫妻最缺什么?】文章来源/沈阳晚报 中国夫妻不缺隐忍坚守,不缺默默付出支持,所以我们的婚姻讲求相濡以沫,同甘...
    映卿阅读 169评论 0 0
  • 1 你有没有特别热爱的事物,热爱到无法替代,容不得别人说三道四,用近乎疯狂的热情度和忠诚度追寻和探索。 我觉得一个...
    自渡说阅读 757评论 0 3