heidern0612 发表于 2018-11-18 08:45:38

【Pyhon 019讲心得体会】【回文联和统计字符串的个数】

本帖最后由 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个字符,想要访问第九个字符,必须是切片的位置。)
    length //= 2                                                #length总长度整除2得到length的重新赋值。这个整除主要是为了判断for循环需要循环几次。(假定字符串有9个字符,则只需要比较前后比较四次就可以。)
    flag = 1                                       
    for each in range(length):                        #for循环判断(假定输入9个字符,则只需要判断range(0,4)四个范围值即可)
      if string != string:                #从输入字符串的开始判断,如果不等于string的位的话.(这里判断的就是字符串第一位跟最后一位是否相同);
                                                        第二次循环从字符串第二位开始,跟string的比较,不符的话.(也就是字符串的第二位和倒数第二位比较)
            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:                                #这句应该是代码中的精华,指定循环param的第个参数,第一次是排位的字符串,下次循环就是排位的字符串。
            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的个数。(统计单个字符在函数位的个数。)

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


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

774821352 发表于 2018-11-19 11:48:57

牛逼

ccluo 发表于 2019-3-29 10:22:59

你这里写错了吧,应该是string与string[-2]进行比较

heidern0612 发表于 2019-3-29 10:37:19

ccluo 发表于 2019-3-29 10:22
你这里写错了吧,应该是string与string[-2]进行比较

感谢提出意见。

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

也就是string与string[-2]进行比较.

田埂 发表于 2020-3-10 15:38:10

本帖最后由 田埂 于 2020-3-10 15:53 编辑

我懂了···

从拍笋世界路过 发表于 2020-5-1 21:32:55

我不懂这句“ for each in param:” ,为什么不直接 if param.isalpha()

从拍笋世界路过 发表于 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.isalpha():   
            letters+=1
      elif param.isdigit():
            digit+=1
      elif param==" ":
            space+=1
      else:
            others+=1
      print("第%d个字符串共有:英文字母%d个,数字%d个,空格%d个,其他字符%d个"%(i+1,letters,digit,space,others))
count("i love")





为什么这样是错的,好苦恼~

heidern0612 发表于 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指的是单个字符串里的每一个元素。

所以你for循环出来的i指的是字符串,而不是字符串的单个元素,都不相等,自然算是other了。

从拍笋世界路过 发表于 2020-5-2 13:43:21

heidern0612 发表于 2020-5-2 07:25
for i in range(length):,这里的i指的是单个的字符串,而不是字符串的每一个元素。

而for each in...

终于懂了,谢谢你呀~
刚回头看了下视频,原来小甲鱼也有说到这个问题的,原来我没认真听{:5_96:}
页: [1]
查看完整版本: 【Pyhon 019讲心得体会】【回文联和统计字符串的个数】