鱼C论坛

 找回密码
 立即注册
查看: 135|回复: 11

[已解决]第十九课:函数课后后面两道题

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

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

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

x
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

    if flag == 1:
        return 1
    else:
        return 0

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


这是确认是不是形成回连的真就是一个看不懂求解
请求帮忙尤其是   if string[each] != string[last]:
[]什么意思啊看不懂一个都看不懂很苦恼


方法二
def palindrome(string):
    list1 = list(string)
    list2 = reversed(list1)
    if list1 == list(list2):
        return '是回文联!'
    else:
        return '不是回文联!'
print(palindrome('上海自来水来自海上'))



list1=list(string)       list不是列表的意思吗这都啥和啥啊








最佳答案
5 天前

  1. def palindrome(string):
  2.     length = len(string)#长度
  3.     last = length-1#最后一个字下标
  4.     length //= 2#长度除二,遍历到中间就行
  5.     flag = 1#标志位
  6.     for each in range(length):
  7.         if string[each] != string[last]:#开头字和末尾的字依次对比,有不等的就把标志位置0
  8.             flag = 0
  9.         last -= 1#下标减一,下一轮对比第二个字和倒数第二个字

  10.     if flag == 1:#标志位==1是回文,否则不是
  11.         return 1
  12.     else:
  13.         return 0

  14. string = input('请输入一句话:')
  15. if palindrome(string) == 1:
  16.     print('是回文联!')
  17. else:
  18.     print('不是回文联!')
复制代码

第二个方法:
    list1 = list(string)#把字符串类型变量string转成列表类型
    list2 = reversed(list1)#反转列表
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
{:10_266:}救命啊好难
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
问题分析及解答:

(第一个方法的问题)
原代码中的 if string != string: 是明显的错误,实际应该是比较首尾对称字符。修正后的核心代码应为:


  1. def palindrome(string):
  2.     length = len(string)
  3.     last = length-1
  4.     flag = 1
  5.     for each in range(length//2):
  6.         if string[each] != string[last]: # 关键修改:比较对称位置的字符
  7.             flag = 0
  8.         last -= 1
  9.     return 1 if flag == 1 else 0
复制代码


逐行解释:
  • string[each] 表示第each个字符(从头开始)
  • string[last] 表示倒数第each个字符(从尾开始)
  • 循环比较前半段和后半段对应字符是否相等


(第二个方法的原理)
方法二通过列表反转实现:

  1. list1 = list("上海自来水") # 得到 ['上','海','自','来','水']
  2. list2 = reversed(list1)   # 得到迭代器,实际内容是 ['水','来','自','海','上']
  3. list(list2)               # 将迭代器转换为实际列表
复制代码


关键点:
  • list(string) 将字符串拆分为单个字符的列表
  • reversed() 返回的是反向迭代器,必须用 list() 转换为实际列表才能比较
  • 直接比较原列表与反转后的列表是否完全相同


总结推荐:
方法二更简洁可靠,推荐使用。方法一需要手动控制索引,容易出错。回文判断本质就是验证字符串与其反向字符串是否完全相同。

示例验证:
原字符串:上海自来水来自海上
反转后字符串:上海自来水来自海上(完全相同)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层    本楼为最佳答案   

  1. def palindrome(string):
  2.     length = len(string)#长度
  3.     last = length-1#最后一个字下标
  4.     length //= 2#长度除二,遍历到中间就行
  5.     flag = 1#标志位
  6.     for each in range(length):
  7.         if string[each] != string[last]:#开头字和末尾的字依次对比,有不等的就把标志位置0
  8.             flag = 0
  9.         last -= 1#下标减一,下一轮对比第二个字和倒数第二个字

  10.     if flag == 1:#标志位==1是回文,否则不是
  11.         return 1
  12.     else:
  13.         return 0

  14. string = input('请输入一句话:')
  15. if palindrome(string) == 1:
  16.     print('是回文联!')
  17. else:
  18.     print('不是回文联!')
复制代码

第二个方法:
    list1 = list(string)#把字符串类型变量string转成列表类型
    list2 = reversed(list1)#反转列表

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
~风介~ + 3 + 3 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

发表于 5 天前 | 显示全部楼层
好难啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
好象能看懂一点了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
xiaoniugogogo 发表于 2025-5-15 09:05
第二个方法:
    list1 = list(string)#把字符串类型变量string转成列表类型
    list2 = reversed(li ...

谢谢您的解惑,但是我有疑问不明白,,小甲鱼老师在   列表 3 中说   reverse():翻转列表
这个题目里面  reveresd  也是反转列表这两个有什么用法上的不同吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
qasa 发表于 2025-5-15 12:09
谢谢您的解惑,但是我有疑问不明白,,小甲鱼老师在   列表 3 中说   reverse():翻转列表
这个题目里面 ...

def count(*param):
    length = len(param)
    for i in range(length):
        letters = 0
        space = 0
        digit = 0
        others = 0
        for each in param[i]:
            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.')
这是下一个题目的代码
编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数
这里我不是很理解是  for i in range(,,,,)    和      for i in ,,,,,,    这里用 range 的分别是什么呢
还有就是   for j in param[i]:  这是从 i 开始吗  
其他的上抖音和b站都搜索到了就这里不明白
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
range(10)其实就是生成了一个[0,1,2,3,4,5,6,7,8,9]的列表,
比如for i in range(10) 就是i等于依次0,1,2,...,9,
for i in __
下划线的地方是一个可迭代对象,通俗讲就是可以循环的,比如列表,然后 i 依次等于其中的每个元素
你的例子里面param[i],比如i=0,param[0]就是字符串数组的第一个字符串比如param[0]=='I love fishc.com.',param[1]=='I love you,you love me';
for j in param[i] 就是依次让j==这些字符串的每个字符,比如j==‘i‘,J==空格.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
qasa 发表于 2025-5-15 12:22
def count(*param):
    length = len(param)
    for i in range(length):


range(10)其实就是生成了一个[0,1,2,3,4,5,6,7,8,9]的列表,
比如for i in range(10) 就是i等于依次0,1,2,...,9,
for i in __
下划线的地方是一个可迭代对象,通俗讲就是可以循环的,比如列表,然后 i 依次等于其中的每个元素
你的例子里面param[i],比如i=0,param[0]就是字符串数组的第一个字符串比如param[0]=='I love fishc.com.',param[1]=='I love you,you love me';
for j in param[i] 就是依次让j==这些字符串的每个字符,比如j==‘i‘,J==空格.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
qasa 发表于 2025-5-15 12:09
谢谢您的解惑,但是我有疑问不明白,,小甲鱼老师在   列表 3 中说   reverse():翻转列表
这个题目里面 ...

list1 = [1, 2, 3]
list1.reverse()  # 直接修改原列表
print(list1)     # 输出:[3, 2, 1]
list2 = [4,5,6]
reversed_list2 = list(reversed(list2))  # 转换为列表
print(reversed_list)  # 输出:[6,5,4]
print(list2)#输出:[4,5,6]
通俗讲一个改变原列表,一个不改变原列表
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 16:25 | 显示全部楼层
xiaoniugogogo 发表于 2025-5-15 14:49
list1 = [1, 2, 3]
list1.reverse()  # 直接修改原列表
print(list1)     # 输出:[3, 2, 1]

谢谢您,我全都明白了,翻阅了一下之前的笔记就是基本功不熟悉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 15:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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