```python
import random
file = input('请输入文件名称:')
if file.endswith('jpg') or file.endswith('gif') or file.endswith('png'):
i = file.find('.')
name = file[0:i]
if len(name) < 6:
# 重新构建名字,产生字母和数字的组合名称
filename = ''
s = 'qwertyuiopasdfghjklzxcvbnm123456'
for i in range(6):
index = random.randint(0, len(s) - 1)
filename += s[index] # 获取下标匹配的字母
# filename 文件名和后缀进行拼接
new = filename + file[i:]
print('成功上传%s文件' % new)
else:
print('上传失败,格式错误')
```率下降 50%
成功上传a3cbadpg文件
输入的文件是123.jpg
i本来是3
你把i改了,它从0到5循环,那后面file[i:]可就不是.jpg了,它变成g了
-=-=-=-=
更本质的原因在于,python没有c语言里块的概念
在c语言里,块内定义的同名变量出了块生命周期就到了,块前定义一个int i=0,块内定义成int i=1,块后i的值还是0,还是块前的那个i
而python里所有定义的对象作用域都是整个代码,只有类和函数有变量隔离的作用,什么if,for,都不会生成一个新的块,这导致在for中修改i之后,出了for,i的值还保留了被for修改之后的值
因为这里 new = filename + file[i:],你的i重新赋值了之后,这里i原本应该是.
的索引,现在也被改了
import random
file = input('请输入文件名称:')
if file.endswith('jpg') or file.endswith('gif') or file.endswith('png'):
i = file.find('.')
name = file[0:i]
if len(name) < 6:
# 重新构建名字,产生字母和数字的组合名称
name = '' #重新构建name
s = 'qwertyuiopasdfghjklzxcvbnm123456'
for i in range(6):
index = random.randint(0, len(s) - 1)
name += s[index] # 获取下标匹配的字母
# filename 文件名和后缀进行拼接
name = name + file[i:]
print('成功上传%s文件' % name)
else:
print('上传失败,格式错误')