Python-三、函数

3.1 def语句和参数

def ...(...)语句用于定义一个函数,以便后面调用函数,如:

def hello(name): #定义函数hello,变元name

    print('hello' + name) #打印hello+变元name

namein = input() #定义namein变量,从键盘取值并赋给namein

hello(namein) #调用hello函数,将namein的变量赋值给变元name。

需注意:函数被调用并返回后,在变元中的值就丢失了。

3.2 返回值和return语句

def语句创建函数时,可以用return语句指定应该返回什么值,如

import random

def getAnswer(answerNumber): #定义一个函数getAnswer,变元answerNumber

    if answerNumber == 1:

        return 'It is certain' #当变元为1时,打印这个结果,下述同理。

    elif answerNumber == 2:

        return 'It is decidedly so'

    elif answerNumber == 3:

        return 'Yes'

    elif answerNumber == 4:

        return 'Reply hazy try again'

    elif answerNumber == 5:

        return 'Ask again later'

    elif answerNumber == 6:

        return 'Concertrate and ask again'

    elif answerNumber == 7:

        return 'My reply is no'

    elif answerNumber == 8:

        return 'Outlook not so good'

    elif answerNumber == 9:

        return 'Very doubtful'

r = random.randint(1, 9) #定义变量r,调用内建函数random,其范围是1到9

fortune = getAnswer(r) #运行自建函数getAnswer,变元值为r。

print(fortune) #打印fortune中的存储结果

3.3 None值

None表示没有值,是NoneType数据类型的唯一值。

注意,print()函数是没有返回值的,与none值相同。

可以通过:

spam = print('Hello')

None == spam

#返回结果为True得出。

3.4关键字参数和print()

关键字是由在调用函数时选用的,通常用于可选变元。

如print中的 end、, 、seq函数。

#end=''

print('Hello',end=' ')

print('World')

结果→→Hello World

# ','

print('Cat','Dog','Mice')

结果→→Cat Dog Mice

# seq = ''

print('Cat','Dog','Mice',sep=',')

结果→→Cat,Dog,Mice

3.5 局部和全局作用域

全局指在本程序中一直生效,局部是指在程序的某一个局部中生效,如果退出局部则失效。

def spam():

    eggs = 99 #局部变量1

    bacon() #此处局部变量2会被打印,对于spam()来说,这里就是局部

    print(eggs) #此处打印结果为99,因为bacon()执行后,bacon()中的局部变量失效了

def bacon():

    ham = 101

    eggs = 0 #局部变量2

spam()

bacon()

全局变量可以和局部变量重名,但我们尽量让他们之间不要重名。

***

def spam():

    print(eggs)

eggs = 42 #全局变量1

spam()

print(eggs)

上代码中的局部变量eggs在


打印时引用了全局变量。

总结:全局会被局部引用,局部不会被全局引用,要想运行轻松点,就要注意别重名啦。

3.6 global语句

为函数命名时加上global语句如“global eggs = 1”,就可以让python知道在这代码全局中所有的eggs函数都值都为1。

函数中一个人变量要么总是全局变量,要么总是局部变量。

3.7 异常处理

由于你不知道用户输入的变元是什么,所以你需要在他们执行前执行一次检查,以免程序直接出错跳出。

#CODE

def spam(divideBy):

    try:

        return 42 / divideBy

    except ZeroDivisionError:

        print('错误:无效输入')

print(spam(2))

print(spam(12))

print(spam(0))

print(spam(1))

#OUTPUT

21.0

3.5

错误:无效输入

None

42.0

3.8 猜数字游戏


#This is a guess number game.

import random

SecretNumber = random.randint(1,20)

print('I have a number, come on and guess.')

#print('PLZ enter a number.')

#Ask the player to guess 6 times.

for guessesTaken in range(1,7):

    print('PLZ enter a number.')

    guess = int(input())

    if guess < SecretNumber:

        print('Your number is too low.')

    elif guess > SecretNumber:

        print('Your number is too high.')

    else:

        break # This condition is the correct guess!

if guess == SecretNumber:

    print('Good job! You guessed my number in ' + str(guessesTaken) + ' times.')

else:

    print('Nope. The number I was thinking of was ' + str(SecretNumber))


3.9 本章习题

1.为什么在程序中加入函数会有好处? 

    函数快,可以消除重复,让代码更短,读起来也更容易。

2.函数中的代码何时执行:在函数被定义时,还是在函数被调用时?

    在函数被调用时执行。

3.什么语句创建一个函数?

    def语句创建函数。

4.一个函数和一次函数调用有什么区别?

    函数是一个开头为def的语句,它包含函数名和函数体。如def guess()

    而函数之后的guess()是一次函数调用,只有当代码执行到guess()时,才会调用函数def guess()下面的函数体。

5.Python 程序中有多少全局作用域?有多少局部作用域?

    在调用函数时,创建了一个全局作用域和一个局部作用域。

6.当函数调用返回时,局部作用域中的变量发生了什么?

    清空。

7.什么是返回值?返回值可以作为表达式的一部分吗?

    返回值即函数执行结束后的返回结果,他可以作为表达式的一部分。

8.如果函数没有返回语句,对它调用的返回值是什么?

    None

9.如何强制函数中的一个变量指的是全局变量?

    global xxx 则 xxx 被强制为一个全局变量。

10.None 的数据类型是什么?

    none.type

11.import areallyourpetsnamederic 语句做了什么?

    导入了一个名为areallyourpetsnamederic的函数,

12.如果在名为 spam 的模块中,有一个名为 bacon()的函数,在引入 spam 后,如何调用它?

    spam.bacon()

13.如何防止程序在遇到错误时崩溃?

    try

    except

    函数进行验证

14.try 子句中发生了什么?except 子句中发生了什么?

    try句子中运行了你的表达式,如果产生错误,则转到except。

    之后程序照常运行。

3.11 代码实践

3.11.1 

编写一个名为 collatz()的函数,它有一个名为 number 的参数。如果参数是偶数,那么 collatz()就打印出 number // 2,并返回该值。如果 number 是奇数,collatz()就打印并返回 3 * number + 1。

然后编写一个程序,让用户输入一个整数,并不断对这个数调用 collatz(),直到函数返回值1(令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到 1!既使数学家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,它有时候被称为“最简单的、不可能的数学问题”)。

记得将 input()的返回值用 int()函数转成一个整数,否则它会是一个字符串。 提示 如果 number % 2 == 0,整数 number 就是偶数,如果 number % 2 == 1,它就是奇数。

这个程序的输出看起来应该像这样:

Enter number:

3

10

5

16

8

4

2

1

def collatz(dd):

    global number

    number = dd

    while number != 1:

        if number % 2 == 0:

            number = number // 2

            print(number)

        elif number % 2 == 1:

            number = number * 3 + 1

            print(number)


3.11.2

在前面的项目中添加 try 和 except 语句,检测用户是否输入了一个非整数的字符串。正常情况下,int()函数在传入一个非整数字符串时,会产生 ValueError 错误,比如 int('puppy')。在 except 子句中,向用户输出一条信息,告诉他们必须输入一个整数。

try:

    nm1 = int(input('请输入一个数字\n'))

except ValueError:

    print('请输入正确的数字!')

else:

    print(collatz(nm1))

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

推荐阅读更多精彩内容