鱼C论坛

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

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

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

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

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

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

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

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

def pre():
    print('我在pre()函数里...')
    
next()                                                    #调用next函数,会输出以上两句话。


2、
 def hello():
        print('Hello FishC!')

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


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

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

最终输出结果是1314520 。



4、
var 全局= ' Hi '

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

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

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

print(fun1())                                打印fun1()函数的内容(其实就是fun2的返回值var)

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

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

        重要的事情说三遍!




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

我比较推荐小甲鱼老师的第二种方法,第二种方法也是我最先想到的。
def palindrome(string):                                     #定义一个函数,包含一个参数
    list1 = list(string)                                                #list1 赋值为字符串顺序排列的列表
    list2 = reversed(list1)                                        #list2 赋值为字符串逆序排列的迭代器,为什么不直接返回一个逆序排列的列表呢?请认真听小甲鱼老师的课(实际上没有返回值,只是把列表反向)……
    if list1 == list(list2):                                        #判断顺序和倒序是否相等
        return '是回文联!'
    else:
        return '不是回文联!'
print(palindrome('上海自来水来自海上'))



另外我还自己想了另外一种方法,也比较简单:
#coding=gbk
def palindrome():        
    temp = input("请输入文联进行验证:")
    if temp == temp[::-1]:         #拿字符串 和字符串逆序进行比较(temp = temp[:],复制一个temp字符串,再把步进设置为-1,就是倒着走。)
        print('是回文联!')
    else:
        print( '不是回文联!')   
palindrome()

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


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

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

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




6、统计字符串个数

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


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

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

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

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

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


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

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-11-19 11:48:57 | 显示全部楼层
牛逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-29 10:22:59 | 显示全部楼层
你这里写错了吧,应该是string[1]与string[-2]进行比较
E05E58CA-617F-4A50-BC70-16BE1E05F521.png
想知道小甲鱼最近在做啥?请访问 -> 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]进行比较.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我懂了···
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-1 21:32:55 | 显示全部楼层
我不懂这句“ for each in param[i]:” ,为什么不直接 if param[i].isalpha()
想知道小甲鱼最近在做啥?请访问 -> 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")





为什么这样是错的,好苦恼~
想知道小甲鱼最近在做啥?请访问 -> 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了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

而for each in  ...

终于懂了,谢谢你呀~
刚回头看了下视频,原来小甲鱼也有说到这个问题的,原来我没认真听
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 18:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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