鱼C论坛

 找回密码
 立即注册
查看: 5022|回复: 28

[技术交流] 第19讲习题代码以及分析

[复制链接]
发表于 2014-7-30 18:14:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 mumudontcry 于 2014-7-30 23:02 编辑

第一行喂@小甲鱼  ,第二行开始
题目我还是不说了(免责声明:要先好好看小甲鱼的好不啦,全让我说了,人家干什么去,再说把题目弄过来,小甲鱼的10鱼币就赚不了啦)
惯例,先说说小甲鱼的答案
嗯……这一次,木木败给小甲鱼了为我默哀吧
为什么这么说,因为我对字符串的函数的操作不是熟悉,导致很多个地方绕了弯路,不过你们还是可以看一下的
(看到木木我栽了,你们会不会有一种大快人心的感觉?)
下面开始分析(你们要题目就老实去做题,我才不会白白让你们得到题目呢~~还有,看了小甲鱼的代码再来看我的,如果你喜欢的话
0
首先是回文联:

小甲鱼的:
方法一
部分代码:
def palindrome(string):
    length = len(string)
    last = length-1
    length //= 2
    flag = 1
    for each in range(length):
        if string[each] != string[last]:
            flag = 0
        last -= 1

小甲鱼思路是从头开始循环的each的前一部分,然后与从尾开始循环的last的后一部分逐个比较,总共执行了总长度一半的次数
方法二
部分代码:
def palindrome(string):
    list1 = list(string)
    list2 = reversed(list1)
    if list1 == list(list2):
        return '是回文联!'
    else:
        return '不是回文联!'
思路是,借助字符串函数reversed,将字符串倒置,然后比较,两种方法都是很容易想到的,方法一比方法二更好


而木木我……啊,已经无法直视了,不过还是有值得借鉴的地方(我才不是找借口呢)
我的代码:

def 回文联():
    tempH = input("请输入一句话:")
    l = len(tempH)
    H = ''
    for i in range(l):
        H = H + tempH[l - i - 1]
    if H ==tempH:
        print("是回文联!")
    else:
        print("不是回文联!")


a、你们知道可以用中文做函数名么?好吧,知道的话请无视我
b、我的思路跟方法二是一样的,可是我忘记了字符串函数reversed!于是就只能用拼接的方法,把输入的字符串从尾到头一个一个取出来,这里你们可能会疑问:为什么要H = '',后面不是有对H赋值么?嗯……没错,后面是有对H赋值,但是,在赋值之前H+tempH[l-i-1]中,H参与了运算,也就是说,H在定义之前就使用了,所以,如果去掉H='',程序是会报错的!也就是说,赋值号的优先级是在加号之后的,这个你们有忘记么?(我虽然知道,但是一开始还是没有注意)
c、然后就是小甲鱼曾经讲过的效率的问题:l = len(tempH)
1
第二题小甲鱼的思路以及程序跟我的都几乎一样,可我总觉得有更好的方法,只是想不出来,弱弱的问一句:有列表字符串的概念么?(估计也没有,应该叫做二维列表吧)就像是:
有一个字符串s,s[0],s[1]……每一个元素都是一个字符串。这种要怎么定义?

好吧,你们忘了吧,这是我的代码:
def count(*params):
    l = len(params)
    for i in range(l):
        a = b = c = d =0
        str1 = params
        for j in range(len(str1)):
            if str1[j].isalpha():
                a = a + 1
            elif str1[j].isdigit():
                b = b + 1
            elif str1[j] == ' ':
                c = c + 1
            else:
                d = d + 1
        print("第",i+1,"个字符串共有:英文字母",a,"个,数字",b,"个,空格",c,"其他字符",d,"个。")

我这里的
for j in range(len(str1)):
            if str1[j].isalpha():

和小甲鱼的
for each in param:(从这一行开始,格式老不对,而且本来这行是for each in param【i】:的,保存后【i】就就消失了,自己注意下,所以这里我改成了中文的中括号,防止消失
            if each.isalpha():

意思是一样的……么?
不太一样!
我的代码的意思是,取每一个元组里的字符串,再取单个字符出来判断是什么类型,而小甲鱼的是,取每一个元组里的字符串的单个字符,判断它是什么类型,我代码在for里还没有取那个字符,而小甲鱼的在for里就已经取出来了
而且他的更加简洁,我这么写就是因为一直在纠结是不是有个叫做“列表
字符串”的东西,啊~~没听懂就算了,这不重要,你们记住他的那种写法就对了,我这个比较容易弄错

写完之后发现,我还有一个东西没有讲,那就是测试题,可能小甲鱼没有讲清楚我补充一下:
测试题的第四题:
Baby I love you
因为,fun1里有个global var,虽然视频里没有讲,但是……global是全局的意思啊焚蛋!又拿没见过的来问问题,小坏鱼。所以,在fun1里改变的var的值可以带出函数,所以,此时,var是"_Baby_"
return一个fun2,于是运行fun2,在fun2中,var变成 Baby I love you,可是这个var是个局部变量,,即接下来调用fun3,把 Baby I love you放到fun3里,var虽然等于小甲鱼,但fun3里的var也是局部的,而且,fun3没有返回var,所以,相当于fun3白运行了
fun2中return了var回fun1的rerurn fun2(var)中的var里,于是再返回fun1,最后打印fun1
所以答案是 Baby I love you
顺带再提一点(有完没完啊!!
本讲视频里开头说:delphi里有区分开函数和过程,很多语言也是有区分函数和过程。可据我所知,也就只有(管他呢?)delphi里有对函数过程区分,别的语言里也是函数过程混在一起的,有过程的概念,但是没有专门的语句,不像delphi有procedure。嗯……有人说,pascal就有procedure!好吧,pascal跟delphi其实是一个语言,只是pascal只面向过程,而delphi是pascal的进化版,是为了面向对象而设计的。想学delphi的可以先看看pascal,容易入门
所以,函数过程其实就可以认为是一样的,要说区别,就是看有没有返回值

最后,木木以可以忽略不计的劣势惜败于小甲鱼,虽然这次没有完成保护人类的任务,但,我还会回来的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
点击当没节操甲鱼遇上傲娇笨笨的木木

查看我的淘帖,喜欢就点“订阅”吧




评分

参与人数 1荣誉 +8 鱼币 +8 贡献 +3 收起 理由
小甲鱼 + 8 + 8 + 3 小甲鱼战胜!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-30 18:52:35 | 显示全部楼层
嘿嘿~好玩~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-30 18:53:10 | 显示全部楼层

我加了一段,关于测试题的,你看看呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-30 18:53:29 | 显示全部楼层
木木,可以创建一个专辑,然后通过淘帖把这些给集合起来,我相信很多朋友会感兴趣的~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-30 18:55:04 | 显示全部楼层
小甲鱼 发表于 2014-7-30 18:53
木木,可以创建一个专辑,然后通过淘帖把这些给集合起来,我相信很多朋友会感兴趣的~

嗯……没怎么懂,建一个目录么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-30 18:55:54 | 显示全部楼层
小甲鱼 发表于 2014-7-30 18:53
木木,可以创建一个专辑,然后通过淘帖把这些给集合起来,我相信很多朋友会感兴趣的~

什么叫做淘帖

点评

论坛的新功能我过阵子专门写一个教程吧... 在此处创建一个属于你个人的专辑:http://bbs.fishc.com/forum.php?mod=collection&op=my 然后点击主题帖的这个按钮: [attachimg]27954[/attachimg] 这样只要  详情 回复 发表于 2014-7-30 18:59
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-30 18:57:15 | 显示全部楼层
小甲鱼 发表于 2014-7-30 18:53
木木,可以创建一个专辑,然后通过淘帖把这些给集合起来,我相信很多朋友会感兴趣的~

吃饭去,回来再看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-30 18:59:15 | 显示全部楼层

论坛的新功能我过阵子专门写一个教程吧...

在此处创建一个属于你个人的专辑:http://bbs.fishc.com/forum.php?mod=collection&op=my

然后点击主题帖的这个按钮:

1.png


这样只要订阅你的专辑的朋友都可以看到你整理的这些帖子。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-30 19:44:30 | 显示全部楼层
小甲鱼 发表于 2014-7-30 18:59
论坛的新功能我过阵子专门写一个教程吧...

在此处创建一个属于你个人的专辑:http://bbs.fishc.com/fo ...

创建好了

点评

小甲鱼血战木木!  详情 回复 发表于 2014-7-30 22:44
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-30 22:44:23 | 显示全部楼层

小甲鱼血战木木!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-30 22:46:26 | 显示全部楼层
小甲鱼 发表于 2014-7-30 22:44
小甲鱼血战木木!

战不动啊,没你知道的多,我这是边学边跟你瞎搞

点评

别这么说,你先收集,我做完统一再对答案进行“加固”,一个问题允许有多个思维,我准备把收集多个答案,这样大家参考的时候也好扩展下。  详情 回复 发表于 2014-7-30 22:50
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-30 22:50:15 | 显示全部楼层
mumudontcry 发表于 2014-7-30 22:46
战不动啊,没你知道的多,我这是边学边跟你瞎搞

别这么说,你先收集,我做完统一再对答案进行“加固”,一个问题允许有多个思维,我准备把收集多个答案,这样大家参考的时候也好扩展下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-30 23:01:15 | 显示全部楼层
小甲鱼 发表于 2014-7-30 22:50
别这么说,你先收集,我做完统一再对答案进行“加固”,一个问题允许有多个思维,我准备把收集 ...

~~让我打飞机就好啦
嗯……我在好好理解闭包,不要打扰木木
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 00:29:51 | 显示全部楼层
小甲鱼 发表于 2014-7-30 22:50
别这么说,你先收集,我做完统一再对答案进行“加固”,一个问题允许有多个思维,我准备把收集 ...

我感觉我理解不了闭包

点评

结合这篇实例理解下:http://bbs.fishc.com/thread-42656-1-1.html  详情 回复 发表于 2014-7-31 13:39
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 13:39:05 | 显示全部楼层
mumudontcry 发表于 2014-7-31 00:29
我感觉我理解不了闭包

结合这篇实例理解下:http://bbs.fishc.com/thread-42656-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 13:40:48 | 显示全部楼层
小甲鱼 发表于 2014-7-31 13:39
结合这篇实例理解下:http://bbs.fishc.com/thread-42656-1-1.html

我看过了,我有个疑问,当一个内部函数成为闭包之后,这个闭包之后的语句会不会被执行,我昨晚试了一下,发现居然不执行,而且貌似一个函数只能有一个闭包

点评

bar在foo函数的代码块中定义。我们称bar是foo的内部函数。 在bar的局部作用域中可以直接访问foo局部作用域中定义的m、n变量。 简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包。 你把疑问举  详情 回复 发表于 2014-7-31 13:44
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 13:42:35 | 显示全部楼层
小甲鱼 发表于 2014-7-31 13:39
结合这篇实例理解下:http://bbs.fishc.com/thread-42656-1-1.html

def funX():
    x = 5
    def funY():
        nonlocal x
        x += 1
        print("没有引用我")
        return x
    print("引用了我",x)
    return funY

a = funX()
print(a())
print(a())
print(a())
比如说这个,如果闭包之后的语句会执行,那么,在输出678以及三个“没有引用我”之后就应该对应分别输出三个“引用了我”

点评

感受一下,这里 a = funX() 其实是得到 funY 函数的地址,然后把它的地址给 a,所以你再调用 a() 就相当于只调用 funY()  详情 回复 发表于 2014-7-31 13:59
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 13:44:53 | 显示全部楼层
mumudontcry 发表于 2014-7-31 13:40
我看过了,我有个疑问,当一个内部函数成为闭包之后,这个闭包之后的语句会不会被执行,我昨晚试了一下, ...
  1. def foo():
  2.     m=3
  3.     n=5
  4.     def bar():
  5.         a=4
  6.         return m+n+a
  7.     return bar

  8. >>>bar =  foo()
  9. >>>bar()
  10. 12
复制代码

bar在foo函数的代码块中定义。我们称bar是foo的内部函数。

在bar的局部作用域中可以直接访问foo局部作用域中定义的m、n变量。

简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包。

你把疑问举个例子,我们研究下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 13:46:23 | 显示全部楼层
小甲鱼 发表于 2014-7-31 13:39
结合这篇实例理解下:http://bbs.fishc.com/thread-42656-1-1.html

实际上却没有输出三个“引用了我”,只有在最开始定义a的时候,输出了一个“引用了我”,但是这是因为a不调用内部函数,直接跳过它,才会运行到那里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 13:47:32 | 显示全部楼层
小甲鱼 发表于 2014-7-31 13:44
bar在foo函数的代码块中定义。我们称bar是foo的内部函数。

在bar的局部作用域中可以直接访问foo局部 ...

疑问在17楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 00:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表