Crossin的编程教室

标题: 【Python 第22课】 函数应用示例 [打印本页]

作者: crossin先生    时间: 2014-4-24 18:22
标题: 【Python 第22课】 函数应用示例
前两课稍稍介绍了一下函数,但光说概念还是有些抽象了,今天就来把之前那个小游戏用函数改写一下。

我希望有这样一个函数,它比较两个数的大小。
如果第一个数小了,就输出“too small”
如果第一个数大了,就输出“too big”
如果相等,就输出“bingo”

函数还有个返回值,当两数相等的时候返回True,不等就返回False。

于是我们来定义这个函数:

def isEqual(num1, num2):
   if num1<num2:
       print 'too small'
       return False
   if num1>num2:
       print 'too big'
       return False
   if num1==num2:
       print 'bingo'
       return True

这里说一下,return是函数的结束语句,return后面的值被作为这个函数的返回值。函数中任何地方的return被执行到的时候,这个函数就会结束。

然后在我们的小游戏里使用这个函数:
from random import randint
num = randint(1, 100)
print 'Guess what I think?'
bingo = False
while bingo == False:
   answer = input()
   bingo = isEqual(answer, num)

在isEqual函数内部,会输出answer和num的比较结果,如果相等的话,bingo会得到返回值True,否则bingo得到False,循环继续。
22.jpeg


函数可以把某个功能的代码分离出来,在需要的时候重复使用,就像拼装积木一样,这会让程序结构更清晰。


作者: xiaohuzai    时间: 2015-3-3 09:38
我看您在写函数的时候,每个if语句是用分号;隔开,我在写函数的时候没有用分号,但是也能运行,请问这个有影响吗?
  1. def isEqual(num1,num2):
  2.     if num1<num2:
  3.         print 'too small'
  4.         return False
  5.     if num1>num2:
  6.         print 'too big'
  7.         return False
  8.     if num1==num2:
  9.         print 'bingo'
  10.         return True
复制代码

作者: crossin先生    时间: 2015-3-3 10:56
xiaohuzai 发表于 2015-3-3 09:38
我看您在写函数的时候,每个if语句是用分号;隔开,我在写函数的时候没有用分号,但是也能运行,请问这个有 ...

啊,那个分号是笔误,已改
作者: zzxomg    时间: 2015-3-12 21:55
  1. #coding:utf-8
  2. #猜数游戏2.0
  3. #zzx 2015.03.12
  4. print '-------------------------欢迎光临新新猜数游戏,猜中了有大奖哦!-------------------'
  5. print '规则:1-10的整数,随机一个'
  6. from random import randint
  7. num = randint(1,11)
  8. flag = True
  9. #比较两数是否相等               
  10. def isEqual(input_num,num) :
  11.                 if input_num < num :
  12.                                 print '您输入的数是:%d,小了哦' %input_num
  13.                                 return True
  14.                 elif input_num > num :
  15.                                 print '您输入的数是:%d,大了哦' %input_num
  16.                                 return True
  17.                 elif input_num == num :
  18.                                 print '您输入的的数是:%d,您很厉害啊,猜对了,亲亲!' %input_num
  19.                                 return False
  20. #循环猜数       
  21. while flag:
  22.                 input_num =int(raw_input('输入你心仪的数吧:'))
  23.                 flag = isEqual(input_num,num
复制代码

作者: catherinemic    时间: 2015-12-29 15:33
标题: 有意思,这样更简洁了~~ Crossin老师,能否再讲讲函数的结...
本帖最后由 catherinemic 于 2015-12-29 15:41 编辑
  1. def isEqual(num1,num2):
  2.     if num1<num2:
  3.         print 'Too small!'
  4.         return False
  5.     if num1>num2:
  6.         print 'Too big!'
  7.         return False
  8.     if num1==num2:
  9.         print 'BINGO!'
  10.         return True
  11. print 'Guess what I think?'
  12. from random import randint
  13. num1=randint(1,100)
  14. bingo= False
  15. while bingo==False:
  16.     answer=input()
  17.     bingo=isEqual(answer,num1)
复制代码
有意思,这样更简洁了~~
Crossin老师,能否再讲讲函数的结束是什么意思呢,感觉就是返回一个值,前面也用到过函数,但是定义的时候并没有写return多少,只是print一些东西,那什么时候需要定义return,什么时候不需要呢?

Python10.png (4.44 KB, 下载次数: 391)

Python10.png


作者: crossin先生    时间: 2015-12-30 15:40
catherinemic 发表于 2015-12-29 15:33
有意思,这样更简洁了~~
Crossin老师,能否再讲讲函数的结束是什么意思呢,感觉就是返回一个值,前面也用到 ...

你让函数做一件事,就是调用函数。
你让函数做一件事,完了告诉给你一个结果,就是调用带返回值的函数。
函数的返回值可以直接赋值给其它变量
作者: catherinemic    时间: 2015-12-31 11:15
crossin先生 发表于 2015-12-30 15:40
你让函数做一件事,就是调用函数。
你让函数做一件事,完了告诉给你一个结果,就是调用带返回值的函数。
...

调用带返回值的函数,明白啦,谢谢crossin老师~~
作者: jinss    时间: 2016-8-21 19:56
本帖最后由 jinss 于 2016-8-21 19:58 编辑

def isEqual(num1,num2):
    if num1<num2:
        print('too small')
        return False;
    if num1>num2:
        print('too big')
        return False
    if num1==num2:
        print('bingo')
        return True
from random import randint
num=randint(1,100)
print('Guess what I think?')
bingo=False
while bingo==False:
    answer=input()
    bingo = isEqual(answer,num)
Guess what I think?
8

Traceback (most recent call last):
  File "F:/python/py22_1.txt", line 17, in <module>
    bingo = isEqual(answer,num)
  File "F:/python/py22_1.txt", line 2, in isEqual
    if num1<num2:
TypeError: unorderable types: str() < int()    为啥呀?




作者: crossin先生    时间: 2016-8-22 09:26
jinss 发表于 2016-8-21 19:56
def isEqual(num1,num2):
    if num1num2:
        print('too big')

你是python3吧,python3 input得到的是字符串,不能直接比较,要转换成数字
answer=int(input())
作者: jinss    时间: 2016-8-22 21:08
crossin先生 发表于 2016-8-22 09:26
你是python3吧,python3 input得到的是字符串,不能直接比较,要转换成数字
answer=int(input()) ...

是的!是的!谢谢老师!
作者: 枫叶落时    时间: 2017-8-12 22:52
from random import randint
Answer=randint(1,100)
totoal=11
left=0
num=0
time=0
well = False
print 'plese input the number you  guess!!!'
while int(num) != Answer:
    while time<totoal :
        num=int(input());  
        time+=1
        left=totoal-time
        if num>Answer:
            print 'too   big,you have['+str(left)+']times'
        elif num<Answer:
            print 'too small,you have['+str(left)+']times'
        elif num==Answer:
            print 'congratulations you get it!'
            time = time+(totoal-time)+1
        else:
            print 'sorry,you have get more then 3 time,can not try again!'
        well = True

先生,这里是我在前面看到一位同学,我进行了一些优化,这个同学一开始不能使这段代码彻底结束,我优化以后,只有回答正确的答案才能结束,但是回答10次以后,却无法结束,修改了几次,都没办法。希望先生能给我一些指点
作者: crossin先生    时间: 2017-8-13 12:59
枫叶落时 发表于 2017-8-12 22:52
from random import randint
Answer=randint(1,100)
totoal=11

你想想逻辑,这里不是两层循环嵌套,只是一层循环,但要满足两个条件。
while的条件改一下
作者: 枫叶落时    时间: 2017-8-13 21:45
from random import randint
Answer  = randint(1,100)
num = 0
time = 0
well = False
print " plese input the number you guess!!"
while num != Answer:
    num = input()
    time += 1


    if num > Answer and time <10:
        print " too big!"


    elif num < Answer and time < 10:
        print "too small"


    elif num == Answer:
        print "congratulations you get it!"


    else :
        print "sorry ,you have get more then 10 time,can not try agani!"
        Answer = num
    well = True
先生,听了你的意见,我成功优化,虽然没有用你23课所教的方法,自己想了一种,跑成功了,非常感谢先生~
作者: wwyy4ever    时间: 2018-2-2 15:37
请问老师,您给出的这段实例里,answer=input(),这个括号里面不能添加内容了吧
作者: crossin先生    时间: 2018-2-2 18:45
wwyy4ever 发表于 2018-2-2 15:37
请问老师,您给出的这段实例里,answer=input(),这个括号里面不能添加内容了吧 ...

可以添加,添加的内容是输入前的提示语
作者: wwyy4ever    时间: 2018-2-5 10:16
crossin先生 发表于 2018-2-2 18:45
可以添加,添加的内容是输入前的提示语

我就在括号里写了‘请输入数字’,然后不管输入什么数字都是too big
作者: crossin先生    时间: 2018-2-5 14:40
wwyy4ever 发表于 2018-2-5 10:16
我就在括号里写了‘请输入数字’,然后不管输入什么数字都是too big

输入的数字不要加引号
作者: Tmyueee    时间: 2018-2-23 11:14
MAC 3.6.4

def isEqual(num1,num2):
    if num1<num2:
        print('too small')
        return False
    if num1>num2:
        print('too big')
        return False
    if num1==num2:
        print('bingo')
        return True

from random import randint
num = randint(1,100)
print ('Guess what I think?')
bingo = False
while bingo == False:
    answer = int(input())
    bingo = isEqual(answer,num)

然后 Run Module
"invalid character in identifier"
最后的num被框红了

不知道该怎么办

作者: TED    时间: 2018-2-23 17:31
Tmyueee 发表于 2018-2-23 11:14
MAC 3.6.4

def isEqual(num1,num2):

标识符中有无效字符,标红num说明在num附近,刚粘贴你代码试了下,num前的逗号改成英文字符就行了

参考链接 http://blog.csdn.net/yeyue0922/a ... tionNum=6&fps=1
作者: 司南    时间: 2018-4-5 21:47
  1. import random
  2. num=random.randint(1,5)
  3. guess=eval(input('guess what I think?'))
  4. def compare(x,y):
  5.     if x<y:
  6.         print('%d is too small' %x)
  7.     elif x>y:
  8.         print('%d is too big' %x)
  9.     else:
  10.         print('bingo')
  11.     return x==y
  12. while num!=guess:
  13.     compare(guess,num)
  14.     guess=eval(input('guess what I think?'))
  15. else:
  16.     print('bingo')
复制代码
老师您好,有个问题想请教您,感觉最后的else怪怪的,但又不知道,一旦没有这个else,如果在x=y时,print一个bingo
之前一直在贴吧跟您学习,但不知道为啥,被系统永远封禁了,所以转战到这里。
作者: crossin先生    时间: 2018-4-6 00:06
司南 发表于 2018-4-5 21:47
老师您好,有个问题想请教您,感觉最后的else怪怪的,但又不知道,一旦没有这个else,如果在x=y时,print一 ...

这样用else也没错

不用这个else,直接顶格 print ,也可以同样效果
作者: 司南    时间: 2018-4-6 10:14
crossin先生 发表于 2018-4-6 00:06
这样用else也没错

不用这个else,直接顶格 print ,也可以同样效果

多谢老师,试过之后果然如此,只要num!=guess,那么就会一直执行while循环,直到二者相等,才会结束循环,执行后面的print。
作者: iris    时间: 2018-5-11 21:01
函数.png
请问,我的为什么直接一个数字就结束,不知道问题出在哪里?

作者: crossin先生    时间: 2018-5-11 22:14
return True
或者
return False

别加引号。原因看 bool类型转换 那课




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5