鱼C论坛

 找回密码
 立即注册
查看: 2466|回复: 8

[学习笔记] 【Pyhon 019讲心得体会】【回文联和统计字符串的个数】

[复制链接]
发表于 2018-11-18 08:45:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 heidern0612 于 2018-12-17 09:57 编辑

写的内容都是自我思考的过程,难免有疏漏,有错误的地方欢迎广大鱼油给予指正!感激不尽

1、

  1. def next():                                        #定义next函数
  2.     print('我在next()函数里...')               
  3.     pre()                                                #调用pre函数,pre函数的内容是打印“我在pre()函数里...”这句话。

  4. def pre():
  5.     print('我在pre()函数里...')
  6.    
  7. next()                                                    #调用next函数,会输出以上两句话。
复制代码



2、

  1. def hello():
  2.         print('Hello FishC!')
复制代码


调用函数的话,会打印print内部的字符串,但是返回的值为空,也就是None.


3、

  1. def fun(var全局):               
  2.     var内部 = 1314                               
  3.     print(var内部, end='')

  4. var全局 = 520
  5. fun(var全局)                                     #调用fun()函数,全局变量进入函数内部后被局部变量重新赋值了,所以调用函数打印的是1314。
  6. print(var全局)                                        #简单的打印全局变量520

复制代码


最终输出结果是1314520 。



4、


  1. var 全局= ' Hi '

  2. def fun1():
  3.     global var                                #声明此函数内部的var是全局变量
  4.     var全局 = ' Baby '                #var重新赋值 = "Baby"
  5.     return fun2(var)                        #返回fun2("Baby I love you"的值给fun1("Baby"))  

  6. def fun2(var全局):                        #定义fun2(Baby)
  7.     var局部 += 'I love you'        #全局变量进入函数内部后+=“i love you”;局部变量变成了"Baby I love you"       
  8.     fun3(var)                                #调用fun3(Baby)无意义
  9.     return var                                #返回var当前的值,var当前值为“Baby I love you”

  10. def fun3(var):                                #定义fun3(Baby)
  11.     var = ' 小甲鱼 '                        #函数内部定义var为“小甲鱼”,出了函数无法调用。

  12. print(fun1())                                打印fun1()函数的内容(其实就是fun2的返回值var)
复制代码


假定这里打印fun2(var)和fun3(var)的话,fun2(var)的打印结果跟fun1()是一样的,fan3(var)由于没有设置返回值,所以返回的是空值,也就是None.

不要轻易使用全局变量!
不要轻易使用全局变量!
不要轻易使用全局变量!

        重要的事情说三遍!




5、回文联,简单说就是顺着读和倒着读是一样的。

我比较推荐小甲鱼老师的第二种方法,第二种方法也是我最先想到的。


  1. def palindrome(string):                                     #定义一个函数,包含一个参数
  2.     list1 = list(string)                                                #list1 赋值为字符串顺序排列的列表
  3.     list2 = reversed(list1)                                        #list2 赋值为字符串逆序排列的迭代器,为什么不直接返回一个逆序排列的列表呢?请认真听小甲鱼老师的课(实际上没有返回值,只是把列表反向)……
  4.     if list1 == list(list2):                                        #判断顺序和倒序是否相等
  5.         return '是回文联!'
  6.     else:
  7.         return '不是回文联!'
  8. print(palindrome('上海自来水来自海上'))
复制代码




另外我还自己想了另外一种方法,也比较简单:

  1. #coding=gbk
  2. def palindrome():       
  3.     temp = input("请输入文联进行验证:")
  4.     if temp == temp[::-1]:         #拿字符串 和字符串逆序进行比较(temp = temp[:],复制一个temp字符串,再把步进设置为-1,就是倒着走。)
  5.         print('是回文联!')
  6.     else:
  7.         print( '不是回文联!')   
  8. palindrome()
复制代码


简单的利用切片功能实现回文联效果,也不用考虑列表,迭代子什么乱七八糟的了。


分析下老师的第一种方法:

  1. def palindrome(string):
  2.     length = len(string)                                #分析字符串总长度       
  3.     last = length-1                                        #设定last复制为总长度减1(假定字符串有9个字符,想要访问第九个字符,必须是切片[8]的位置。)
  4.     length //= 2                                                #length总长度整除2得到length的重新赋值。这个整除主要是为了判断for循环需要循环几次。(假定字符串有9个字符,则只需要比较前后比较四次就可以。)
  5.     flag = 1                                       
  6.     for each in range(length):                        #for循环判断(假定输入9个字符,则只需要判断range(0,4)四个范围值即可)
  7.         if string[each] != string[last]:                #从输入字符串的[0]开始判断,如果不等于string的[last]位的话.(这里判断的就是字符串第一位跟最后一位是否相同);
  8.                                                         第二次循环从字符串第二位[1]开始,跟string的[last -1]比较,不符的话.(也就是字符串的第二位和倒数第二位比较)
  9.             flag = 0                                        #flag赋值为0,last自身减1,返回for循环,开始第二次判断。
  10.         last -= 1
  11.                                                                 #有同学说了,卧槽我比较一次不相同,后面还用比较吗?这个for循环看着很邋遢啊。万一第一次相同,第二相同,第三次相同,第四次来个不相同呢? for循环主要就是干这个事的。

  12.     if flag == 1:                                                #后面就不用解释了,应该都能理解了。
  13.         return 1
  14.     else:
  15.         return 0

  16. string = input('请输入一句话:')
  17. if palindrome(string) == 1:
  18.     print('是回文联!')
  19. else:
  20.     print('不是回文联!')

复制代码





6、统计字符串个数

先分析下老师的代码:


  1. def count(*param):                                        #定义函数,传入参数个数未定。
  2.     length = len(param)                                #统计传入参数的长度,注意:这个len的是字符串的个数,而不是单个字符串的长度。假如传入的有两个字符串,那么这个len就是2.
  3.     for i in range(length):                                #for循环遍历整个字符串的长度,用于指定循环的次数,假如只有两个字符串,就循环(0,2)。也就是(0)一次,(1)一次。
  4.                                                                
  5.         letters = 0
  6.         space = 0                                                #初始化四个统计值。
  7.         digit = 0
  8.         others = 0
  9.         for each in param[i]:                                #这句应该是代码中的精华,指定循环param的第[i]个参数,第一次是排位[0]的字符串,下次循环就是排位[1]的字符串。
  10.             if each.isalpha():
  11.                 letters += 1
  12.             elif each.isdigit():
  13.                 digit += 1
  14.             elif each == ' ':
  15.                 space += 1
  16.             else:
  17.                 others += 1
  18.         print('第 %d 个字符串共有:英文字母 %d 个,数字 %d 个,空格 %d 个,其他字符 %d 个。' % (i+1, letters, digit, space, others))
  19.             
  20. count('I love fishc.com.', 'I love you, you love me.')

复制代码



理清下思路,关于传入未知多个字符串的这种统计,分析如下:

1、用len统计字符串的个数。

2、for循环统计总共需要循环几次(根据字符串的个数来算)。

3、for循环统计某个字符在param[i]的个数。(统计单个字符在函数[i]位的个数。)

4、输出打印,调用函数,指定参数,程序结束。


有点难,一点点分析还算比较简单,需要记住这种算法。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-11-19 11:48:57 | 显示全部楼层
牛逼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-29 10:22:59 | 显示全部楼层
你这里写错了吧,应该是string[1]与string[-2]进行比较
E05E58CA-617F-4A50-BC70-16BE1E05F521.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-29 10:37:19 | 显示全部楼层
ccluo 发表于 2019-3-29 10:22
你这里写错了吧,应该是string[1]与string[-2]进行比较

感谢提出意见。

不过我没写错,last是最后一位的话,last-1就是倒数第二位。

也就是string[1]与string[-2]进行比较.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-10 15:38:10 | 显示全部楼层
本帖最后由 田埂 于 2020-3-10 15:53 编辑

我懂了···
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-1 21:32:55 | 显示全部楼层
我不懂这句“ for each in param[i]:” ,为什么不直接 if param[i].isalpha()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-1 22:19:32 | 显示全部楼层
def count(*param):
    length=len(param)
    for i in range(length):
        letters=0
        space=0
        digit=0
        others=0
        if param[i].isalpha():   
            letters+=1
        elif param[i].isdigit():
            digit+=1
        elif param[i]==" ":
            space+=1
        else:
            others+=1
        print("第%d个字符串共有:英文字母%d个,数字%d个,空格%d个,其他字符%d个"%(i+1,letters,digit,space,others))
count("i love")





为什么这样是错的,好苦恼~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-2 07:25:04 | 显示全部楼层
从拍笋世界路过 发表于 2020-5-1 22:19
def count(*param):
    length=len(param)
    for i in range(length):

for i in range(length):  ,这里的i指的是单个的字符串,而不是字符串的每一个元素。

而for each in param[i]:  这里的i指的是单个字符串里的每一个元素。

所以你for循环出来的i指的是字符串,而不是字符串的单个元素,都不相等,自然算是other了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 13:43:21 | 显示全部楼层
heidern0612 发表于 2020-5-2 07:25
for i in range(length):  ,这里的i指的是单个的字符串,而不是字符串的每一个元素。

而for each in  ...

终于懂了,谢谢你呀~
刚回头看了下视频,原来小甲鱼也有说到这个问题的,原来我没认真听
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 10:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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