花了4天时间看完了这本书,遇到了几个有趣的问题
Q1.赋值问题
4个列表值相同是意料中的,但是is判断有两个false则出乎预料
查阅资料后才明白,list0 = [‘longchaos’, ‘love’, ‘python’]这行代码创建了一个列表对象 [‘longchaos’, ‘love’, ‘python’],然后把引用(指针)赋给list0;
当执行 list1 = [‘longchaos’, ‘love’, ‘python’] 这行代码时,系统重新创建了一个列表对象[‘longchaos’, ‘love’, ‘python’],并把引用赋给list1;
所以list0和list1值虽然相同,但是他们指向的内存是不同的,
因此list0 is list1结果为false。
而list2 = list0,则是把list0的引用赋给list2,所以它们不仅值相同,引用也相同。
至于 list3 = list0[:],python是先对list0进行‘dereference’得到列表对象[‘longchaos’, ‘love’, ‘python’] ,然后执行[‘longchaos’, ‘love’, ‘python’] [:]复制得到一个新的对象,其值也是[‘longchaos’, ‘love’, ‘python’],然后把这个新的列表对象的引用赋给list3,所以list0和list3的引用也是不同的
Q2.将zip命令添加至环境变量
在做备份文件这个小练习时,涉及到让windows识别zip命令的问题
这个流程其实我是很清楚的,但是添加之后发现在pycharm的终端模式下,并不能使用python命令。
同样是上网查阅资料后,才明白环境变量设置后,只有从开始菜单或者windows+R打开的终端才能立即使用命令。其他位置比如pycharm的终端或者从文件管理器里打开的终端都是无法使用的,要等到电脑重启一次后才会生效
另附
import os
import time
import zipfile
# 1.需要备份的文件与目录将被
# 指定在一个列表中。
# 例如在Windows下:
source = r'D:\\Files\Fish'
# 又例如在Mac OS X 与 Linux下:
# source = ['/users/swa/notes']
# 在这里要注意到我们必须在字符串中使用双引号
# 用以括起其中包含空格的名称。
# 2.备份文件必须存储在
# 一个主备份目录中
# 例如在Windows下:
target_dir = r'D:\\longchaos\Practice'
# 又例如在 Mac OS X 和 Linux 下:
# target_dir = '/users/swa/backup'
# 要记得将这里的目录地址修改至你将使用的路径。
# 如果目标目录还不存在,则进行创建
if not os.path.exists(target_dir):
os.mkdir(target_dir) # 创建目录
# 3.备份文件将打包压缩成 zip 文件。
# 4.将当前日期作为主备份目录下的子目录名称
today = target_dir + os.sep + time.strftime('%Y%m%d')
# 将当前时间作为 zip 文件的文件名
now = time.strftime('%H%M%S')
# 添加一条来自用户的注释以创建
# zip 文件的文件名
comment = input('Enter a comment --> ')
# 检查是否有注释输入
if len(comment) == 0:
target = today + os.sep + now + '.zip'
else:
target = today + os.sep + now + '_' + \
comment.replace(' ', '_') + '.zip'
# 如果子目录还不存在,说明今天还没有备份,则进行创建
if not os.path.exists(today):
os.mkdir(today)
print('Successfully created directory', today)
# 5.我们使用 zipfile 模块将文件打包成 zip 格式
# 创建一个 ZipFile 对象
backup_to_zip = zipfile.ZipFile(target, 'w', zipfile.ZIP_DEFLATED)
# os.walk() 得到一个三元tuple(dirpath, dirnames, filenames)
# 第一个为当前正在遍历的这个文件夹的本身的地址
# 第二个为一个 list 内容是该文件夹中所有的目录的名字(不包括子目录)
# 第三个同样是 list 内容是该文件夹中所有的文件(不包括子目录)。
for dirpath, dirnames, filenames in os.walk(source):
for filename in filenames:
# os.path.join() 连接2个或更多的路径名组件
# 如果各组件名首字母不包含'/',则函数会自动加上
# 如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃
# 如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾
directory = os.path.join(dirpath, filename)
backup_to_zip.write(directory) # 进行备份
print(backup_to_zip.namelist())
backup_to_zip.close()
Q3.导致电脑死机的一段代码
在检查字符串是否回文的小练习里,我不小心搞错了参数和参数的位置,ctrl+shift+f10后结果电脑直接死机了(没事不要尝试)
原因我暂时也不知道,如果有大神看到望不吝赐教
另附修改后能识别英文标点符号和空格及大小写的回文代码
import string
def reverse(text):
return text[::-1]
def is_palindrome(text):
# 将空格加入英文标点字符串
# 不能过滤中文标点符号
punctuations = string.punctuation + ' '
for i in punctuations:
if i in text:
text = text.replace(i, '')
return text.lower() == reverse(text).lower() # 忽略大小写
something = input('Enter text: ')
if is_palindrome(something):
print('Yes, it is a palindrome')
else:
print('No, it is not a palindrome')