分享

基础语法常见问题

 太阳神qy2nvvyr 2022-07-20 发布于湖南

📚使用说明⭐

遇到困难就查看这个文档,帮助你解决90%的问题,搜索解决方法就 ctrl+f,搜索关键词,进行查找,不需要看完全文!!!

带有⭐的就是重要知识讲解

  1. 如何重置文件&代码

答:点击左上角文件夹,找到指定的文件,点击文件旁边的圆圈重置

  1. 如何下载课件

助教答:根据上图,在重置文件旁边有个下载的箭头,就是下载课件到本地


八个主线关卡都包含课后练习,但并非都有选修课堂。从图中可以看到,只有第四、五、七关会包含额外的选修课堂。

第 1 关【数据类型及应用的常见问题】

  1. Python 暂不可以写入简历常遇问题

在编程中英文的大小写有区别,要保证大小写书写一致

问题:这里为什么不是输出 'Python 暂不可以写入简历'?

助教答:编程的大小写有区别的,终端输入的P要首字母大写

  1. print函数和单双引号详解

https://blog.csdn.net/sinat_28576553/article/details/81154912?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161996202516780269857484%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161996202516780269857484&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-81154912.first_rank_v2_pc_rank_v29&utm_term=python+print%E5%87%BD%E6%95%B0

  1. str类型和int类型相乘解析

问题:请问为什么把 15 放进括号里一起 int 会得到这样的结果呢?

答:👍

这个问题是字符串多次写入的用法,当字符串和*以及数值组合时,就是将这个字符串进行相应次数的写入。

该题在终端输入 2,赋值给 day,day 为字符串类型,day*15,也就是'2' *15,就是变成 15 个 2,然后进行 int 转换,和 500 进行相减得出结果

例如:

上面字符串*5 就是打印 5 次这个字符串

  1. 变量名不能重复

问题:这里一直运行通过不了是怎么回事呢?

助教答:变量名 name 不能重复,将 input 赋值的变量名更换成 a 或者其他变量名,不用 name 命名即可解决

第 2 关input函数和数据类型转换问题

  1. ⭐出现【invalid syntax】错误怎么解决

常见的报错类型(重要)

问题:我遇到 invalid syntax 这个语法报错,该怎么解决?

助教答:第 2 行少了一个括号。遇到 invalid syntax 这个语法报错就检查上面一行的括号和中英文标点哈

①问题:这个不明白报错怎么解决

Plain Text
# 输入当地华氏温度
f = int(input('天气预报,当地华氏温度:'))
# 换算为摄氏温度
c = int((f - 32) / 1.8)
# 打印当日温度:用 str() 进行数据类型转换
print('当日温度华氏温度'+str(f)+',摄氏温度'+str(c))
# 打印当日温度:用 str.format() 的第一种用法
print('当日温度华氏温度{},摄氏温度{}'.format(f,c)
print('当日温度华氏温度{ff},摄氏温度{cc}'.format(ff=f,cc=c))

助教答:第 8 行少了一个括号,加个括号就好。遇到这个报错就检查报错行数上面一行代码

修改代码为:

Plain Text
print('当日温度华氏温度{},摄氏温度{}'.format(f,c))
  1. input 和 print 的区别问题

input 函数为字符串类型,要记得数据类型的转换

  1. 查看元素类型用 type,并用 print 进行打印

:如何查看字符类型并打印?

助教答:

Plain Text
print(type(journey[0]))


  1. 数据类型的转换常遇问题

问题:请问一下:我记得 int 是可以直接把小数点省略啊,为什么这样写无法运行?

助教答:这个是跟数据类型转换有关,你可以把 b 写成 int(float())就会成功

str为字符串类型,int为整数型,float为浮点小数

str( ):将其他类型转换为字符串

int( ):将其他类型转换为整数【文字类和小数类的字符串,无法转换成整数;小数类字符串要先转化为浮点数,才能转化为整数;浮点数转化为整数是抹零取整】

float( ):将其他类型转换为浮点数【文字类字符串,无法转化成浮点数】

就是说:3

1、小数类字符型要先转换成浮点数,再由浮点数转成整数

2、整数类的字符串可以直接用 int 转换


问题:助教我这里为什么会这样?不是 111 或者 000 才会显示中奖嘛

错误代码如下:

Plain Text
num_list1 = ['0', '1', '0', '1', '1', '0', '1', '0', '1', '0']
num_list2 = ['0', '1', '1', '1', '0', '0', '1', '0', '0', '1']
num_list3 = ['1', '0', '1', '1', '0', '1', '1', '0', '1', '1']
# 获取输入的三位数信息,并赋值给 num
num = input('请输入三位数')
# 提取三位数中的百位数
hundreds_digit=num[0]
# 提取三位数中的十位数
tens_digit=num[1]
# 提取三位数中的个位数
ones_digit=num[2]
# 分别从三个数字列表中提取值,并拼接得到兑换码 code
code = num_list1[hundreds_digit]+num_list2[tens_digit]+num_list3[ones_digit]
# 如果兑换码是 111 或 000,打印兑换码以及'恭喜您中奖了!'
if code =='111' or code=='000':
    print('兑奖码是'+code+'恭喜您中奖了!')

# 否则,打印兑换码以及'很遗憾您没有中奖。'
else:
    print('兑奖码'+code+'很遗憾您没有中奖')

5

助教答:上面的问题是由于这里hundreds_digit=num[0],从列表中取出的元素没有转换成数值,导致下面code计算的时候偏移量是字符串类型,num_list1[hundreds_digit]这里中内部的偏移量hundreds_digit为字符串类型,所以会报错。

修改代码为:hundreds_digit=int(num[0]),后面的2个同样加上int( )转换。

Plain Text
num_list1 = ['0', '1', '0', '1', '1', '0', '1', '0', '1', '0']
num_list2 = ['0', '1', '1', '1', '0', '0', '1', '0', '0', '1']
num_list3 = ['1', '0', '1', '1', '0', '1', '1', '0', '1', '1']
# 获取输入的三位数信息,并赋值给 num
num = input('请输入三位数')
# 提取三位数中的百位数
hundreds_digit=int(num[0])
# 提取三位数中的十位数
tens_digit=int(num[1])
# 提取三位数中的个位数
ones_digit=int(num[2])
# 分别从三个数字列表中提取值,并拼接得到兑换码 code
code = num_list1[hundreds_digit]+num_list2[tens_digit]+num_list3[ones_digit]
# 如果兑换码是 111 或 000,打印兑换码以及'恭喜您中奖了!'
if code =='111' or code=='000':
    print('兑奖码是'+code+'恭喜您中奖了!')
# 否则,打印兑换码以及'很遗憾您没有中奖。'
else:
    print('兑奖码'+code+'很遗憾您没有中奖')
  1. 数据拼接要保证数据类型一致

问题:请问第六行为什么不能加字符?

助教答:字符串的拼接要保证字符串类型一致哈,你在最后将 c 转换成字符串类型,加个 str(c)


问题:这种内部的数据类型要一样吗?当我去掉 python 的引号的时候发现错误了

助教答:

python 这个字符在编程内部使用的时候也要进行字符串转换,要不然跟用中文一样,都会报错,要加单引号进行转换。

数据类型一致你可以理解为:字符和字符拼接,整数和整数拼接,列表和列表拼接,字符串的拼接跟你里面是否一致无关哈,跟外部整体类型有关,要保持一致

  1. format()格式化字符串的用法

https://www.cnblogs.com/lovejh/p/9201219.html


课程中讲的是str.format( )用法,这里str是指这个点 . 左边必须是字符串类型,而不是写成str

关于format格式化字符串的用法,我在这里讲一下:

例如:print('今天温度{ }'.format(w))

这里会将format后面的w变量传给前面花括号位置处,用花括号就是占位的;当format后面跟的变量较多时,会按照前后顺序这样依次传参

当然也可以指定位置传参,比如:

print('今天温度{r1 },{w1 }'.format(w1=w,r1=r))

记住,这个时候要进行标识符传参,即w1=w,这样子,要是直接写变量名就会报错

还有更多format的用法,建议大家看看这个拓展链接进行学习

https://www.cnblogs.com/lovejh/p/9201219.html

format用法

还有百度,CSDN等网站也可以进行百度拓展查找合适的资料进行学习

Another Liz同学问:我不太懂,为什么要再用一个新变量age_guitar来对应一个可以直接用的变量age?

这里也是传参的另一种方式,在format后面进行将age传给age_guitar,进行内部传参,也就是标识=值的传参,这里考察的点是:内部通过标识进行传参,跟前面花括号中的变量名进行匹配。

这种方法了解就好,用起来比较繁琐

  1. %s、%f、%d 格式化字符串详解

https://blog.csdn.net/zjbyough/article/details/96466658?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161987538116780269831577%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161987538116780269831577&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-4-96466658.first_rank_v2_pc_rank_v29&utm_term=%25s%25f%25d%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%94%A8%E6%B3%95

问题:字符串的格式化操作 str.format() 的 2 种使用,是否有规定的使用限制,还是可任意使用?对于下图划线的花括号{} 内的标识是否一定要使用英文?

答:字符串的格式转换没有规定的使用限制哈,只要有进行数值转换的地方,就可以使用 format 进行转换。

{ }内的标识一定要使用英文,编码中不能使用中文,而且英文的大小写也是有区别的哈,主要大小写也要保持一致。

2


问题:第一种写法不是更简单吗?为什么还要用第二种写法?

助教答:

这里考察的是格式化字符串的用法,而不是简单与否哈,因为编程的方法有很对,咱们现在学的是多种实现方法

格式化字符串的用法还有很多种,同学可以学习拓展一下,链接放在了图片上面

  1. \n 为转义字符,转移字符的拓展

问题:这个里面知枫为什么要加斜杠?这个知枫只有一个斜杠,是什么意思?

Plain Text
print('小白兔,\n 白又白。\n 两只耳朵竖\t 起来。')
print('爱吃萝卜,\n 爱吃菜。')
print('\'知枫\'觉得上面的儿歌很\'有趣\'。')

助教答:\n 是换行符,换到下一行的作用;\' 和 \' 就是将后面的单引号或双引号转义出来,就像知枫最后打印带有单引号

换行符一定要加引号才能成功转换

同时,换行符\n要放在字符串内


  1. int 为向下取值,取整数的几种方法

python 中取整的几种方法

https://www.cnblogs.com/Devilf/p/8043033.html

第 3 关 if、elif、else 条件判断问题

  1. 一个=为赋值,2个==为等于
  1. 条件语句的拓展学习

https://www.runoob.com/python/python-if-statement.html

条件判断有 3 种:

单向判断:if、

双向判断:if......else......

多向判断:if......elif......else......

if 嵌套:条件嵌套,额外条件要在基础条件下缩进

条件执行有且只有一个 if,一个 else,中间的多层判断用 elif,else 可有可无,else 是否定上面 if、elif 所有的判断条件,所以 else 后面不能跟判断条件哈

问题:老师我这里报错是怎么回事

Plain Text
a=int(input('猜猜风变成立几周年了:'))
if a>6:
    print('猜对了')
else 0< a <=6:
    print('猜错了')

助教答:else 后面不能跟判断条件哈,else 是否定上面 if 所有的条件才执行 else,所以后面不能跟判断条件。咱们只能开头有一个 if,结尾有一个 else,多个判断条件在中间使用 elif。

修正代码:

Plain Text
a=int(input('猜猜风变成立几周年了:'))
if a>6:
    print('猜对了')
else :
    print('猜错了')

问题:问请问如果题目要求有 2 个判断条件,请问是否可以先赋值如右下图?

助教答:可以的

  1. 布尔值真假理解

布尔值:True(真)、False(假)

and为和,且的意思,使用and时,全真为真,一假则假;

or为或的意思,使用or时,全假则假,一真则真;

第 4 关列表和元组常见问题

  1. 元组的逗号为什么要加?

当元组只有一个元素的时候,后面要跟逗号,系统用于区分这个是元组类型,这也是元组的特性

  1. 列表切片、索引的讲解

切片:就是将列表中的某个片段拿出来处理

优势:可在列表中一次取出多个元素。

列表、元组偏移量如果从左边数都是从0开始计算的,从右边向左数是从-1开始

比如:有个学生的成绩为“罗恩102\n”,\n为换行,这个字符串的偏移量该如何数呢?

正向的偏移量从0开始数,反向的偏移量从-1开始数,同时换行符\n也是一个字符串,也要计算进去。

咱们取偏移量量的类型为:列表、元组、字典、字符串等可迭代对象,整数是一个整体不能进行偏移量的取值,而字符串是可以的。

可迭代对象元素

小红

小张

小李

小王

正向(从左向右数)

0

1

2

3

反向(从右向左数)

-4

-3

-2

-1

  1. python中可迭代对象和不可迭代对象介绍

https://blog.csdn.net/wrnedy/article/details/104704204

https://www.cnblogs.com/zhangshan33/p/11175209.html

  1. 三位数中奖问题解析

Plain Text
'''
作业题思路:
这道题的想法设计是,利用输入的三位数数值当作列表的偏移量数值,去取列表的元素,
然后用取出来的列表元素,拼接成新的三位数,作为中奖数值。
例如:输入345,然后把3、4、5当作3个列表的偏移量数值,取列表中的元素num_list1[3]、num_list2[4]、num_list3[5],
将此时的num_list1[3]即1,num_list2[4]即0,num_list3[5]即1,拼接组成101,去进行最后的if判断,验证是否中奖
'''
num_list1 = ['0', '1', '0', '1', '1', '0', '1', '0', '1', '0']
num_list2 = ['0', '1', '1', '1', '0', '0', '1', '0', '0', '1']
num_list3 = ['1', '0', '1', '1', '0', '1', '1', '0', '1', '1']

# 输入一个3位数并赋值给num,由于整数不能进行偏移量的取值,所以不能转成int(input('请输入一个三位数:'))
num = input('请输入一个三位数:') 
hundreds_digit = int(num[0])   # 提取三位数中的百位数,并将字符串转成整数,因为列表的偏移量数值要int型
tens_digit = int(num[1])       # 提取三位数中的十位数
ones_digit = int(num[2])       # 提取三位数中的个位数

#利用输入的数值传给列表当作偏移量数值,提取列表中的元素,然后将元素进行字符串拼接,组成新的三位数,此时code为字符串类型
print(num_list1[hundreds_digit])
print(num_list2[tens_digit])
print(num_list3[ones_digit])
code=num_list1[hundreds_digit]+num_list2[tens_digit]+num_list3[ones_digit]

# 将code进行判断,看是否中奖
if code =='111'or code =='000': 
#上面的判断不能偷工减料,要写全,写成code=='111' or '000'的情况时系统会这样分开判断,即:code=='111','000'由于000为真,or是一真则真,全假则假
#所以不能那样写,要写全,即:code =='111'or code =='000'
    print('恭喜您中奖了!')
else:
    print('很遗憾您没有中奖。')

助教答:

另外要注意的点是,or判断的语句要规范来使用,要写完整的代码,例如:

if code == '111' or code == '000':

而不能偷工减料写成if code == '111' or  '000':

因为:我们学过布尔值就会知道,除了空字符串,其他字符串的布尔值都为真,所以'000'是一定为真的

这里的条件判断也就顺理成章的,无论你输入什么都满足两个条件中的其中一个,就会执行if条件下的语句了

正确的写法应该是:if code=='111' or code=='000',这样系统才知道是code为这两个值的时候才满足条件

  1. 元组准换列表常见问题报错解析

🙃同学问:老师我这里转换成了列表怎么还是报错

助教答:由元组转换成列表,新的类型要有变量进行接收,可以用原来的变量名,即army=list(army)

  1. break、continue、pass和else的常见问题总结

break是跟循环语句使用,来结束循环的,单独的if判断不用break,遇到break后,后面的代码不执行,直接跳出循环

continue是继续,也是在循环内部使用,单独的if判断不用continue,在循环内部触发continue时,是向上继续,即回到循环的开头,continue后面的代码将不执行;但是会继续循环

pass意思是跳过,什么都不做,占位而已;

else语句不仅可以跟if使用,还可以跟for和while循环使用,如果正常结束循环就执行else语句;如果是因为遇到break语句就不执行else语句。

  1. len 函数:计算列表元素个数,长度

https://blog.csdn.net/weixin_30885111/article/details/99133355?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162073549016780261916854%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162073549016780261916854&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-4-99133355.first_rank_v2_pc_rank_v29&utm_term=python%E4%B8%ADlen%28%29%E7%9A%84%E7%94%A8%E6%B3%95

https://blog.csdn.net/cumubi7552/article/details/107803690?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162073549016780264017285%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162073549016780264017285&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-10-107803690.first_rank_v2_pc_rank_v29&utm_term=python%E4%B8%ADlen%28%29%E7%9A%84%E7%94%A8%E6%B3%95

  1. del、pop()、remove()删除元素的区别

https://blog.csdn.net/weixin_34751996/article/details/113648968?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161961430816780261943086%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161961430816780261943086&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-113648968.first_rank_v2_pc_rank_v29&utm_term=del%E5%92%8Cpop%E7%9A%84%E5%8C%BA%E5%88%AB

  1. append()和 extend()添加元素的区别

https://www.sohu.com/a/411833442_571478

  1. 列表的替换、添加、删除


问题:能不能实现不把“小红”换成“小黑”,而是在小红和小刚之间添加小黑?

助教答:可以的,利用列表切片,也就是偏移量元素的提取方式进行中间添加。

把列表前面的元素利用偏移量提取出来存到 1 表,后面添加新元素到 1 表,然后提取原来表中后面的部分添加到 1 表的后半部分。

问题:意思就是:原前半部分+添新元素+原后半部分 意思

助教答:理解正确

😊😁

👍

  1. 列表和元组的对比区别

https://blog.csdn.net/daniel_y89/article/details/107692661 列表和元组的区别

  1. 狸猫换太子新思路代码

问题:我在做第四关课后练习的时候,有这样一道题:

上面是原答案,我想从如果有很多元素的情境下做,就写了以下代码,虽然运行成功,不过有一个bug,就是在第二个for循环里,我事先看得到内置列表有几个元素所以设置了range(3),请问如果我不知道内置列表有几个元素,或者究竟有没有内置列表的时候怎么处理鸭(谢谢老师老师辛苦了!)

助教答:

你是说,在不知道多少个元素的时候如何用range的方法循环,找到合适的元素是吗?

如果是这个想法的话可以这样分析:

首先的想法是好的,采用len函数计算列表元素长度,我们可以换个思维,采用元素类型来判断要不要进行嵌套循环取元素,我整理了简洁的小案例,你可以复制代码到课程编辑器运行

Plain Text
a=[1,2,[3,4],5,6,[7,8]]
for i in a:
    print(i)
    if type(i)==int:
        print('遍历的i为整数')
    elif type(i)==list:
        print('遍历的i为列表,继续嵌套循环取元素')
        for n in i:
            print(n)
            if type(n)==int:
                print('遍历的n为整数')
            elif type(n)==list:
                print('遍历的n为列表,继续嵌套循环取元素')

接着再改你的代码,下次提问时粘贴上的代码哈,方便助教直接那你代码修改

点击右上角的插入——代码块

Plain Text
baby_list=['大公主','二公主',['三公主','太子'],'小王爷','小公主']
a=0 #定义a用于计算元素偏移量的位置
for i in baby_list: #先去循环baby_list列表
    if type(i)==list: #判断i取的元素类型如果为列表,将进行循环嵌套
        print('i遍历的元素类型为列表,继续进行嵌套循环取值')
        for n in i: #遍历n去取i列表中的元素
            if n=='太子': 
                baby_list[a]='狸猫' #修改列表中的元素,格式为:列表名[偏移量]=新元素
                break
    a=a+1
print(baby_list)

第 5 关for循环常见问题

  1. i=i+1 与 print上下位置不同打印区别

图一:程序从上往下运行,

第一次循环的时候 i=0,此时的 i 小于101,为真,进入while循环;

执行打印 i *5的结果,即打印0*5=0的结果;

然后进行 i 的自加,此时自加后的 i 为1,新的 i 值作为新的初始条件,判断 i 能否进入while循环;

1小于101,为真再次进入while循环;

执行打印 i *5的结果,即打印1*5=5的结果;

然后进行 i 的自加,此时自加后的 i 为2,新的 i 值作为新的初始条件,判断 i 能否进入while循环;

就这样不断重复循环直至 i 值大于等于101时,while后面的判断条件为加,结束循环

图一:程序从上往下运行,

第一次循环的时候 i=0,此时的 i 小于101,为真,进入while循环;

先进行 i 值的自加,此时自加后的 i 值为1;

执行打印 i *5的结果,即打印1*5=5的结果;

然后新的 i 值即1,作为新的初始条件,判断 i 能否进入while循环;

1小于101,为真,再次进入while循环;

先进行 i 值的自加,此时自加后的 i 值为2;

执行打印 i *5的结果,即打印2*5=10的结果;

然后新的 i 值即2,作为新的初始条件,判断 i 能否进入while循环;

就这样不断重复循环,直至 i 值大于等于101时,while后面的判断条件为加,结束循环

打印的初始值区别:

当先执行 i = i+1,后执行print(i)时,打印结果会先打印 i+1的值,而不是 i 的值;

当先执行print(i),后执行 i = i+1时,打印结果会先打印 i 的值,而后进行 i 值的自加

所以,谁在前面先打印谁的值。

总结归纳:

循环次数:判断值-初始值,即 101-0=101次,

打印初始值看 i=i+1在打印前还是在后,

在前面,i 值发生变化,打印变化后的 i 值;

在后面,就是先执行打印初始值,之后进行a值的自加。

:支线学习任务中,要求输出0,2,4,6,8,我编程如下,输入的结果错误是什么原因?

助教答:由于的a自加在print的上面,所以会先进行a的自加,再打印变化后的值。如果想让0作为打印的初始值,即把print放在a自加的上面,即:

Plain Text
print(a)
a += 2

:为什么我这边终端显示的是三个'金子',题目要求是两个'金子'。

助教答:因为你原本的第4行有一个元素金子,新添加进去2个遍历的金子,所以总共是3个金子。第3行的注释解释了,建一个空列表,所以gold_list=[ ],里面不能先写入一个金子的元素哈

  1. while、if后面跟的条件为真才会执行循环或者进入判断,且True首字母要大写,True为真,所以 无限循环
  1. for 循环遍历&列表字典取值的总结

list=[1,2,3]

dict={'小明':70, '小红':'88', '小丽':90, '亮亮':99}

当 for i in range(3):这种就是循环打印,循环次数为 3 次,0、1、2;range 的取值从 0 开始,到 n-1 结束,即 3-1=2 结束;

当 for i in list: 这种就是遍历 list 列表中的元素,i 为 list 中的元素。其中 i 变量可以用任意变量名,不一定用 i 变量名;

当 for i in dict:这种就是遍历字典的键,i 为键,也就是字典中的小明,

取键值格式是:字典名[键],即 dict[i],取出来 70

  1. range函数用法

https://blog.csdn.net/hanhanwanghaha/article/details/105901052?ops_request_misc=&request_id=&biz_id=102&utm_term=range%E5%87%BD%E6%95%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

  1. 关于口红、鼠标的代码解析

Plain Text
'''——————————————重点提前知——————————————
for i in 列表/字典/元组等可迭代对象:
其中i变量名可以更改为任意变量名,不一定用i,for遍历循环就是i变量依次取出后面列表等迭代对象中的元素'''

hand_bag = ['钱包', '雨伞', '钥匙包', '口红']
computer_bag = ['电脑', '雨伞', '鼠标']
bag_list = [hand_bag, computer_bag] #这里的个嵌套列表,即[['钱包', '雨伞', '钥匙包', '口红'],['电脑', '雨伞', '鼠标']]
'''for 循环语句遍历bag_list'''
for bag in bag_list:
    print(bag) 
    '''添加print进行验证bag遍历的元素,遍历的是hand_bag这个列表,打印整个列表'''
    '''for 循环语句遍历bag中的元素'''
    for item in bag: 
        print(item) 
        '''添加print进行验证item遍历的元素,遍历的是hand_bag列表中一个个的元素'''
        '''if 语句判断,如果元素为'雨伞',跳过循环'''
        if item=='雨伞':
            continue 
        '''遇到continue,程序回到for循环的开头,开始新的循环'''
    print(item) 
    '''这个print跟上面的for循环是对齐的,所以是进行完整个for循环后,打印最后的item元素,即口红、鼠标'''
  1. 冰凉粉列表循环使用n=n+1的解析

Plain Text
'''
题意考察重点:统计列表元素个数、统计循环次数。
规律:当for循环遍历列表/元组/字典时,循环次数就是元素个数
for i in 列表/字典/元组等可迭代对象:
其中i变量名可以更改为任意变量名,不一定用i,for遍历循环就是i变量依次取出后面列表等迭代对象中的元素
'''

foods = ['薄荷冰粉', '龟苓膏', '草莓圣代']  
n = 0 #设定n的初始值
for food in foods: #food变量去遍历上面foods这个列表中的元素,有3个元素,所以会循环3次
    n = n + 1 #每循环一次n就加1,也就是在统计循环次数,同时也是计算列表元素个数
    print(str(n) + '份甜品') #这个print缩进在for循环里面,也就是每循环一次就打印一次

  1. 好吃/饱了代码解析

Plain Text

'''——————————————重点提前知——————————————
for i in 列表/字典/元组等可迭代对象:
其中i变量名可以更改为任意变量名,不一定用i,for遍历循环就是i变量依次取出后面列表等迭代对象中的元素'''

cake_number = [1, 2, 3, 4, 5]
# for 循环遍历cake_numberp
for number in cake_number:#number去取cake_number列表中的元素,所以number会依次是1,2,3,4,5整数型
    print(number)
    # if 条件语句判断,如果数字小于等于4打印'好吃',否则打印'饱了'
    if number <= 4:#当number小于等于4才会进入if里面判断,并打印好吃,所以打印好吃的number会有1,2,3,4
        print('好吃')
    else:#当number大于4才会进入else里面判断,并打印饱了,所以打印饱了的number会有5
        print('饱了')
  1. 列表的嵌套循环解析

Plain Text
'''——————————————重点提前知——————————————
for i in 列表/字典/元组等可迭代对象:
其中i变量名可以更改为任意变量名,不一定用i,for遍历循环就是i变量依次取出后面列表等迭代对象中的元素'''
number_list1 = [45, 66, 45, 76, 54]
number_list2 = [60, 23, 67, 84, 70]
total_list = [number_list1, number_list2] #这里相当于是个嵌套列表,展开就是[[45, 66, 45, 76, 54],  [60, 23, 67, 84, 70]] 
#嵌套列表的循环要写2层循环,层层变量取出最终的列表元素

# 使用 for 循环语句遍历 total_list
for list in total_list: #这里是list去取total_list列表中的元素,即list接收number_list1,由于number_list1为列表,此时list是列表类型

    # 使用 for 循环语句遍历 list 中的元素
    for i in list : #这里不能用int作为接收变量名,int是python中的内置函数不能用特殊变量名,可以用i等其他普通变量名
        #用i去遍历上面的list列表,即第一个number_list1列表,去取number_list1列表中的元素

        print(i) #第9行定义的变量名是i,所以这里是打印i
        # 使用 if 语句进行条件判断,如果数字大于60,则打印数字

        if i > 60:
            print(i)

  1. 闰年平年的计算解析

Plain Text
# 设置起始年份
year = 1899

# 设置结束年份
while year < 2020:
    # 累加年数
    year += 1 #这里是简写,相当于year=year+1
    str_year = str(year)  #由于int型无法进行偏移量的取值,只能转成str类型可以取值

    # 判断年数是否为整百
    if str_year[-2:] == '00':#偏移量从左边数是从0开始,从右边数是从-1开始,[-2:]代表从倒数第2个元素开始取,取到最后的元素
        # 如果为闰年,直接打印
        if str(year / 400)[-1] == '0': #程序计算除数时会保留一位小数,所以这里判断最后一个数值是否为0
            print(str_year + '年是闰年')
    # 年数非整百
    else:
        # 如果为闰年,直接打印
        if str(year / 4)[-1] == '0':
            print(str_year + '年是闰年')

  1. 数羊的代码解析

Plain Text
i = 0 #定义i变量用于后面循环区间的使用

while True:  #while True是个无限循环
    i += 1  # i 自加的简写,可以写成 i=i+1 
    # 设定区间的左端点
    left_endpoint = 1 + 5 * ( i - 1 ) #计算出来是 1+5*0=1
    # 设定区间的右端点
    right_endpoint = 1 + 5 * i   #计算出来是 1+5*1=6
    # 遍历区间,并打印数羊
    for num in range(left_endpoint, right_endpoint): #此时第一次for循环range范围为(1,6)
        print(str(num)+'只羊') #range的特征是左取右不取,所以取1、2、3、4、5,循环5次

    # 获取是否睡着的信息
    answer = input('睡着了吗?回答是或否:')

    # 如果回答'是',终止循环,并打印'终于睡着了'
    if answer == '是':
        break #当不进入if判断中时,就不会遇到break,不会结束整体循环,然后重新开始i值的自加,第2次循环时i变成2,range范围区间变成(6,11)
    print('继续数羊')#当回答的问题不符合if条件,不进入if循环,就会执行print语句,打印继续数羊
print('终于睡着了')

  1. continue、break、else等与循环搭配案例

这里有个需要注意的点就是:

当在循环内正常结束循环的时候才会执行else,当遇到break中断导致非正常结束循环的时候就不会执行else语句,我给你举个例子

break是跟循环语句使用,来结束循环的,单独的if判断不用break,遇到break后,后面的代码不执行,直接跳出循环

continue是继续,也是在循环内部使用,单独的if判断不用continue,在循环内部触发continue时,是向上继续,即回到循环的开头,continue后面的代码将不执行;但是会继续循环

当while后面跟True时,首字母要大写,如:while True:将进行无限循环,除非遇到break将结束循环;【终止无限循环:ctrl+c退出】或者刷新页面

pass意思是跳过,什么都不做,占位而已;

else语句不仅可以跟if使用,还可以跟for和while循环使用,如果正常结束循环就执行else语句;如果是因为遇到break语句就不执行else语句。

案例:

再结合这个总结可知,循环可以和else搭配,当正常结束循环的时候会执行else语句,非正常循环不会执行else语句

第 6 关字典常见问题

  1. 字典注意事项:

字典在for循环取元素的过程中,循环取的是键,然后字典名[键]取出来后面的键值

字典的键是唯一的,不可变的,后面的键值可以改变,所以键元素的类型必须是 不可变,即列表不能做键,因为列表是可变的类型。


  1. 列表和字典的对比区别

https://blog.csdn.net/qq_45476428/article/details/107249448 列表和字典的区别

  1. 字典中 items()函数的用法

https://blog.csdn.net/weixin_38664232/article/details/90763042?ops_request_misc=&request_id=&biz_id=102&utm_term=python%E9%87%8Citems()&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

字典 items()的用法最后会返回 2 个值,key 和 value 也就是键和键值是个元组

  1. 学习成绩相加的代码解析

Plain Text
students_scores = {
    '张虹': {'语文': 97, '数学': 87, '英语': 89},
    '李希': {'语文': 86, '数学': 91, '英语': 93},
    '王京': {'语文': 89, '数学': 89, '英语': 91},
}

#写出循环体,依次读出学生名字;
for name in students_scores:
    #按名字作为键,提取某个学生的成绩字典并赋值给临时变量;
    student_info = students_scores[name]
    #在临时变量上增添一个新键值对,新的键值对的值由该学生的三个科目成绩相加得到
    student_info['总成绩'] = student_info['语文'] + student_info['数学'] + student_info['英语']
    #在循环过程中不能改变循环的此外层字典的元素,所以要将总成绩添加到内层未进行循环的字典中
#把整个字典打印出来看看
print(students_scores)

第 7-8关函数与类常见问题

  1. 【函数学习内容】

函数的基本语法:

def 函数名():

函数体

return 语句

return语句返回一个值时是单独的元素,返回多个的时候是一个元组

要执行函数时要对函数进行调用,即:函数名()

函数先调用才执行,只定义不调用是不会执行的,所以在函数和类中,代码的执行顺序是从调用地方开始的即从下往上执行代码

  1. 【类学习内容】

本关讲解了类,类属性,类方法,其中类是对某个群体的统称;而且类名的首字母要大写,以便我们能轻松辨认出。

类的实例化格式:实例名=类名()

person=Computer()

self 是所有实例的替身,它的作用相当于先给实例占了个位置,等到实例创建好就“功成身退,退位让贤”

用类编写一个直观的好处就是参数的传递会比普通函数要省事很多,也不必考虑全局变量和局部变量,因为类中的方法可以直接调用属性。

  1. return和print的区别

print只是终端打印显示,不代表这个函数最终的返回值结果。

当你想用这个函数最终结果,去做其他很多事的时候,就需要用return,并把函数返回结果进行赋值。

比如:a=drive(4),将drive函数返回值的结果赋值给a,方便a在后面代码中进行数据流传。

比如你去医院看病,医生只口头表述了你的情况,告诉你状况好还是不好,并没有报告结果单给你,这个就相当于print,只能看或者听

如果医生告诉你有报告单,这个就是return的效果,有返回值

如果你需要这个结果,就自己去自助打印机那里打印结果,这个时候结果已经缓存在系统中了,如果你想打印就需要加print,比如:print(函数( ))

或者也可以直接把这个结果赋值给新的变量进行接收,方便后续代码使用该值

即:a=函数名()

Plain Text
def hospital():
    状况=input('医生,他的身体状况如何?请回答:好或者不好')
    print('小明的状况是{}'.format(状况))#这个打印相当于医生只告诉你情况,但是没有报告单结果,耳听
    return 状况#这个返回值就相当于医生告诉你检查结果出来了,去自助打印报告单
    #如果想打印就在外面第7行加print,不想打印等需要这个报告单的时候再打印也可以,结果已缓存在系统

报告结果单=hospital()#这里是把报告单结果赋值给一个变量,方法其他地方使用这个结果
print(报告结果单)#这里相当于去自助打印机,打印报告单结果进行查看

  1. 调用类属性、类方法的报错问题

问题:我调用类方法和类属性的时候报错,错误代码如下:

Plain Text
# 定义类 Cars
class Cars:
    # 初始化方法
    def __init__(self, color, shape):
        # 属性(外形构造)
        self.color = color
        self.shape = shape
        print('您定制的汽车颜色为:{},大小为:{},可以开始试驾了。'.format(self.color, self.shape))6

    # 方法 (动力、操作系统)
    def drive(self, speed):
        print('一辆{}色的{}汽车{}向前开'.format(self.color, self.shape, speed))

    def stop(self):
        print('一辆{}色的{}汽车快速停车'.format(self.color, self.shape))

    def skr(self, speed):
        print('一辆{}色的{}汽车{}漂移'.format(self.color, self.shape, speed))

# 实例化类,并命名为 new_car
new_car =Cars
# 调用并打印类的属性(color、shape)验证结果
color=input('请输入颜色')
shape=input('请输入车型')
print(new_car)
# 调用类的方法(drive、stop、skr)实现题设要求
new_car.drive('缓慢')
new_car.stop()
new_car.skr('缓慢')

助教修改后的代码如下:

Plain Text
# 定义类 Cars
class Cars:
    # 初始化方法
    def __init__(self,color,shape):
        # 属性(外形构造)
        self.color = color
        self.shape = shape
        print('您定制的汽车颜色为:{},大小为:{},可以开始试驾了。'.format(self.color, self.shape))
    # 方法 (动力、操作系统)
    def drive(self, speed):
        self.speed = speed
        print('一辆{}色的{}汽车{}向前开'.format(self.color, self.shape, speed))
    def stop(self):
        print('一辆{}色的{}汽车快速停车'.format(self.color, self.shape))
    def skr(self, skr):
        self.skr = skr
        print('一辆{}色的{}汽车{}漂移'.format(self.color, self.shape, self.skr))
# 实例化类,并命名为 new_car
new_car =Cars('金色','大')
# 调用并打印类的属性(color、shape)验证结果
print(new_car.shape)
print(new_car.color)
# 调用类的方法(drive、stop、skr)实现题设要求
new_car.drive('90')
new_car.stop()
new_car.skr('360°')

报错原因:

首先,代码最上面用了初始化方法,当进行类的实例化后,初始化方法会立即执行。

由于初始化方法中定义了 2 个参数,所以进行类实例化的时候要进行传参

Plain Text
即:new_car =Cars('金色','大')

  1. 《7-9关预习指导资料》

https://docs./docs/KT3WpX8CDTyx6qYt/ 《7-9关预习指导资料》

https://docs./docs/GYDCPKXG6vv9PVt6/ 《第7关类知识资料》

函数和类的调用流程.pdf0.8MB

我们要怎么去理解函数.pdf1.4MB

类与对象中self的作用.pdf0.6MB

  1. 爬行类动物代码解析

Plain Text
# 定义列表 animal_list
animal_list = ['爬行类动物']
# 定义 字典 animal_info1 和 animal_info2
animal_info1 = {'哺乳类动物': '虎', '鱼类动物':'三文鱼', '家禽类动物': '鸡'}
animal_info2 = {'两栖动物':'龟', '昆虫':'蝴蝶'}

# 定义函数,功能是遍历字典,获取字典的键,添加至列表中
def animal_add (info):  #程序会从调用函数的地方开始执行,即先运行第16行。函数内部定义了info这个参数,方便它在函数内部流传
                        #即16行的animal_info1这个字典传给info,info为字典类型
    for i in info:      #for循环遍历info这个字典,遍历字典遍历的是键
        animal_list.append(i) #此时i为字典的键,即为'哺乳类动物','鱼类动物'等,并把它们添加到第2行的animal_list这个列表中
    # 打印列表 animal_list
    print(animal_list)

# 调用 animal_add() 函数,传入参数 animal_info1
animal_add(animal_info1)
# 调用 animal_add() 函数,传入参数 animal_info2
animal_add(animal_info2)  #执行完上面15行函数的调用再以同样的方式执行这个函数的调用
  1. 学生总成绩计算代码解析1

Plain Text

students_scores = {'张虹': {'语文': 97, '数学': 87, '英语': 89},
                   '李希': {'语文': 86, '数学': 91, '英语': 93},
                   '王京': {'语文': 89, '数学': 89, '英语': 91}
                   }
#定义函数,计算总成绩并增添到students_scores字典中,最后打印字典
def scores_sum(dicts): #dicts作为临时变量接收字典的传参,因为遍历过程中不能直接修改原来的字典,所以要找临时变量先接收
    #代码先运行18行,先进行函数的调用,再从第9行开始执行函数

    for name in dicts:
        #按名字作为键,提取某个学生的成绩字典并赋值给【临时变量】;
        student_info = dicts[name]
        #在【临时变量】上增添一个新键值对,新的键值对的值由该学生的三个科目成绩相加得到
        student_info['总成绩'] = student_info['语文'] + student_info['数学'] + student_info['英语']
    #把整个字典打印出来看看
    print(dicts)

#传入参数,调用函数
scores_sum(students_scores)


  1. 学生总成绩计算代码解析2

Plain Text
'''
题目要求:
    王老师需要知道某个班某一门科目的平均分是多少,希望你能帮她能编写一个函数:
    输入班级的成绩表和指定的科目,函数能输出这个班的这门课的平均分。
    请你编写并调用求平均分函数,输出 students_scores 的语文、数学、英语平均分。

这个dicts是个嵌套字典,外层字典的键是张虹,外层的键值是一个整体的字典成绩{'语文': 97, '数学': 87, '英语': 89}
其次键值这个字典中,键是语文,键值是成绩。区分好内外层的字典接下来进行遍历计算
'''
dicts = {'张虹': {'语文': 97, '数学': 87, '英语': 89},
                   '李希': {'语文': 86, '数学': 91, '英语': 93},
                   '王京': {'语文': 89, '数学': 89, '英语': 91}
                   }

#定义函数和传入参数,要先执行下面第38行调用函数,才能运行16-34整体定义的函数
def subject_avg(students_scores, subject):  #这里是将36行的dicts传给了students_scores,所以此时students_scores为上面的dicts字典
    #定义人数计数变量和成绩求和变量
    count = 0 
    score_sum = 0 
    #循环遍历外层字典,读出每个学生的成绩字典
    for student in students_scores:  #遍历students_scores字典,遍历的是键
        print(student)  #当不明白遍历内容的时候就加print打印,进行查看,此时student为张虹
        for subject in students_scores[student]: #要计算成绩所以要去取成绩数值,students_scores[student]代表内层字典整体
            print(subject) #这里打印的就是内层字典的键,即语文,数学

            #按学科名称读出学科成绩并求和,用计数变量count记录总人数
            #取键值的方法为:字典名[键],这是由于字典嵌套要写多个键值取成绩:students_scores[student][subject] 取出97,87

            score_sum += students_scores[student][subject]  
            #上面一行这里是进行了简写,n+=1,即为n=n+1,score_sum =score_sum + students_scores[student][subject]
            count += 1 
        #求取平均值并打印输出。
        avg = score_sum/count 
        print('{}课的平均成绩是{}分'.format(subject, avg))
#调用求均值函数
subject_avg(dicts, '语文')
subject_avg(dicts, '数学')
subject_avg(dicts, '英语')

第 9 关模块导入与文件编码常见问题

  1. 文件顺序有以及文件读写类型

  1. import 模块 和 from 模块 import 函数

  1. open和with open 的区别

https://www.cnblogs.com/dingjiaoyang/p/11004065.html

https://blog.csdn.net/charuiyu/article/details/86360453

  1. writeline、writerow的介绍

https://blog.csdn.net/Parzival_/article/details/107283250?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162375340416780261981591%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162375340416780261981591&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-107283250.first_rank_v2_pc_rank_v29&utm_term=writerow%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D&spm=1018.2226.3001.4187

https://blog.csdn.net/Zhongjie1986/article/details/91448373?ops_request_misc=&request_id=&biz_id=102&utm_term=writelines%E3%80%81writerow%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

  1. os模块介绍

OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作。

os模块介绍

https://blog.csdn.net/weixin_44897792/article/details/95455084?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162338654216780357211005%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162338654216780357211005&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-95455084.first_rank_v2_pc_rank_v29&utm_term=os&spm=1018.2226.3001.4187

 os模块下的listdir() 函数用于返回指定文件夹下,文件或文件夹名字的列表。 函数用于返回指定文件夹下,文件或文件夹名字的列表。

  1. 路径拼接问题解析

问题:上面已经设置了文件路径,为何下面还要加一个操作叫通过文件夹拼接文件名的方式获取路径

助教答:

os模块是处理系统操作的一个模块

第7行是定义文件夹的路径

第10行是使用os模块下的listdir命令获取文件下的所有文件名,此时这个接收变量file_list的个可迭代对象,我们要通过for循环去遍历提取文件名

所以此时的file接收的是文件名

我们要获取文件的完整路径,要拼接前面的文件夹路径,所以第18行我们进行最终文件的路径拼接

os模块介绍

https://blog.csdn.net/weixin_44897792/article/details/95455084?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162338654216780357211005%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162338654216780357211005&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-95455084.first_rank_v2_pc_rank_v29&utm_term=os&spm=1018.2226.3001.4187

  1. 相对路径的理解

https://docs./docs/XhdV9tKJgjJqyCw9/ 《相对路径的理解》

  1. csv文件乱码

https://blog.csdn.net/fwj_ntu/article/details/78563962


  1. 文档打开是乱码问题

方案1: 修改右下角编码“utf-8”为“gbk”试试,部分电脑系统默认为gbk。遇到类似的错误尝试多改几次

步骤为:点击编码>>>通过编码重新打开>>>输入gbk查找就可以选择

另附有视频可以参考, 分享给同学

vscode对csv改编码显示.mp42.7MB


  1. 非法字符/ufeff(或者空格)

解决办法:将代码中的'utf-8'改为'utf-8-sig'


  1. CSV文件介绍

csv 是一种纯文本形式的文件,一般由值(数据)和逗号,构成,不包含文字排版格式、单元格样式等内容,存储的信息会比 Excel 文件少,读取时间更快。

Python操作CSV格式文件

https://blog.csdn.net/weixin_36279318/article/details/79078255?ops_request_misc= %257B%2522request%255Fid%2522%253A%2522162512421216780262556791%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162512421216780262556791&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-79078255.pc_search_result_before_js&utm_term=csv%E6%96%87%E4%BB%B6&spm=1018.2226.3001.4187

csv模块

https://blog.csdn.net/weixin_42444693/article/details/105735167?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162512627616780269897248%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162512627616780269897248&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-6-105735167.pc_search_result_before_js&utm_term=csv.dictreader%28%29&spm=1018.2226.3001.4187

第 10 关找bug常见问题

  1. ⭐出现【invalid syntax】错误怎么解决

常见的报错类型(重要)

  1. 问题:我遇到 invalid syntax 这个语法报错

答:第 2 行少了一个括号。遇到 invalid syntax 这个语法报错就检查上面一行的括号和中英文标点哈

问题何已经修改文件编码为GBK ,encoding='GBK',还是显示编码格式不正确?

附加点--第8关的知识点好绕,学了后面的知识点,忘了前面的;如果不对照着知识点来看,好难写出正确的代码。有点蒙圈 (??)。请助教指点

助教答:路径要进行转义,修改为双斜杠\\

2.路径转义引起的错误修改方法

修改方法1:在路径前面加r,即保持字符原始值的意思。

Plain Text
file1=open(r'c:\Users\xuyiwei\Desktop\scores.txt.txt','r',encoding='utf-8')

修改方法2:替换为双反斜杠:

Plain Text
file1=open('c:\\Users\\xuyiwei\\Desktop\\scores.txt.txt','r',encoding='utf-8')

修改方法3:改为正斜杠

Plain Text
file1=open('c:/Users/xuyiwei/Desktop/scores.txt.txt','r',encoding='utf-8')

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多