[TOC]
python学习中的常见问题
我的意中人是个盖世英雄,我知道有一天他会在一个万众瞩目的情况下出现,身披金甲圣衣,脚踏七色云彩来娶我,我猜中了前头,可是我猜不着这结局。
FAQ 即 Frequently Asked Questions 的缩写,表示常见问题,官方列了 27 个常见问题,完整清单在此:https://mp.weixin.qq.com/s/zabIvt4dfu_rf7SmGZXqXg
1、IndentationError: unindent does not match any outer indentation level
占位问题,存在两种可能性:1.代码没有对齐 2.存在非法字符与其他格式的不可见的内容(输入法的问题)
2、AttributeError: module 'socketserver' has no attribute 'ForkingMixIn'
解决办法:将 SocketServer.ForkingMixIn 替换为 SocketServer.ThreadingMixIn
3、为啥不使用switch语句
该文档给出了几个建议,告诉了我们几个 switch/case 的替代方案:
使用 if-elif-else 条件判断语句 使用字典,将 case 值与调用的函数映射起来 使用内置 getattr() 检索特定的对象调用方法
4、靶场测试
靶场测试,即 range test,指的是对武器弹药的技术性能作各种测试验证,与药物的临床试验一样,都是在最终产品交付前的一项关键性测试。
5、dataframe插入空行
analysis_result = pd.DataFrame(columns=['对应栋号', '出售状态', '总共数量', '100平方', '124平方', '142平方'])
for sheet_name in sheet_names:
sold_list, unsold_list, rate_list = analysis_house_sold(data)
sold_list.insert(0, '全部')
sold_list.insert(0, sheet_name)
unsold_list.insert(0, '未售')
unsold_list.insert(0, sheet_name)
rate_list.insert(0, '去化率')
rate_list.insert(0, sheet_name)
nan_list = [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]
df = pd.DataFrame([sold_list, unsold_list, rate_list, nan_list], columns=analysis_result.columns)
analysis_result = analysis_result.append(df, ignore_index=True)
print(analysis_result)
6、将小数转换为半分数字符串
sold_cnt = data.shape[0]
unsold_cnt = unsold_data.shape[0]
rate = (sold_cnt - unsold_cnt) / sold_cnt
rate = format(rate, '.2%') # 保留两位小数
print(rate)
7、python调用python文件使用
from slave import var
from slave import func
print('var = ', var)
print('10 + 20 = ', func(10, 20))
var = 12345
def func(a, b):
return a + b
运行结果:
var = 12345
10 + 20 = 30
8、python的import并不能将其py文件中的库文件import进来
9、class类的继承和重写函数
#父类
class Animal(object):
def run(self):
print("animal running-----")
#子类
class Cat(Animal):
# 重写
def run(self):
print("cat running-----")
10、数组转list
ndarray.tolist()
11、Python中有没有类似c语言中#define的功能?
首先python是动态语言,不用声明变量的类型所以 #define uchar unsigned char 这个没有。#define a x-y在python 中,简单粗暴的 a = x-y
total = lambda x, y: x+y total(3, 5)8
12、tkinter鼠标点击事件
各种点击事件
事件一览表
事件 代码 备注
鼠标左键单击按下 1/Button-1/ButtonPress-1
鼠标左键单击松开 ButtonRelease-1
鼠标右键单击 3
鼠标左键双击 Double-1/Double-Button-1
鼠标右键双击 Double-3
鼠标滚轮单击 2
鼠标滚轮双击 Double-2
鼠标移动 B1-Motion
鼠标移动到区域 Enter
鼠标离开区域 Leave
获得键盘焦点 FocusIn
失去键盘焦点 FocusOut
键盘事件 Key
回车键 Return
控件尺寸变 Configure
13、浮点数比较相等
https://blog.csdn.net/xfxf996/article/details/107789006
14、python中import其他文件夹下的模块
将该文件夹加入系统路径下面:
# 增加libary库的搜索路径
sys.path.append('../../libary/')
15、_tkinter.TclError: image "pyimage1" doesn't exist
因為在一個程式中只能存在一個根視窗,也就是說只能存在一個Tk(),其他的視窗只能以頂層視窗(Toplevel())的形式存在。
如果是作为一个库文件调用的话,可以这样写:
def picture_browser(master=None):
if master == None:
root = tk.Tk()
else:
root = tk.Toplevel() #创建一个Tk根窗口组件
root.title('测试')
16、解决treeview的颜色样式个性化
找了好久都没有解决,几乎到了快放弃的阶段,最终在两个网站中找到了灵感。 https://www.it1352.com/1887538.html https://www.cnpython.com/qa/113726 改变一行数据的颜色,即一个选定的项目,不能改变一个单元格。如果需要改变,则需要使用到Canvas。 python3使用tkinter做界面之颜色
17、添加tkinter.ttk.Style()变量后打开窗口会多出一个tk窗口
发现是由于把tkinter.ttk.Style()弄成全局变量了,改成局部变量后解决。
18、_tkinter.TclError: couldn't recognize data in image file "D:\images\1 (10).jpg"
不清楚原因,主要是不要使用tk.PhotoImage调用图片,https://blog.csdn.net/username666/article/details/113615073 Tkinter仅支持3种文件格式,即GIF、PGM和PPM。 可以安装PIL模块,通过导入PIL模块,使用里面的函数实现。Python PIL支持GIF、JPEG、PCD、PNG、PPM、PSD等30多种图像文件格式。
import tkinter as tk
filename = 'D:\\images\\1 (10).jpg'
root = tk.Tk()
photo = tk.PhotoImage(file=filename)
label1 = tk.Label(root,text='学习python', justify='left',
image=photo,compound='center',font=('Consolas',10),fg='white')
label1.pack()
root.mainloop()
而是使用PIL库。
from PIL import ImageTk,Image
img_pil = Image.open(r'./image/'+self.files[self.index])
if img_pil.size[0] > self.img_max_width or img_pil.size[1] > self.img_max_height:
img_pil = img_pil.resize((self.img_max_width, self.img_max_height))
self.img = ImageTk.PhotoImage(img_pil)
19、AttributeError: module 'tkinter' has no attribute 'ttk'
很奇怪,添加from tkinter.ttk import Scrollbar, Checkbutton, Label, Button即可
20、RuntimeError: main thread is not in main loop
https://www.maixj.net/ict/runtimeerror-main-thread-is-not-in-main-loop-21037
网络上几乎找不到对这个问题的简单有效解决方案,后来自己看python官方文档,发现在线程start之前,设置一个daemon属性为True,这个问题就解决了。代码大概是这样的:
msg_handle = threading.Thread(target=msg_pp, args=(sock,))
msg_handle.daemon = True
msg_handle.start()
21、python报错:'gbk' codec can't decode byte 0xb9 in position 14: illegal multibyte sequence解决办法
原因:文件内容中含有中文 原代码:f = open(r'E:\0 paper\shiyan\pjdata.txt') 报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xb9 in position 14: illegal multibyte sequence 更正代码:f = open(r'E:\0 paper\shiyan\pjdata.txt',encoding='utf-8') 解决办法:将open文件路径后加上encoding='utf-8'即可解决问题
22、NameError:name ‘xrange’ is not defined
在Python 3中,range()与xrange()合并为range( )。
23、NameError: name 'unicode' is not defined
简单来说就是: Python2 的unicode 函数在 Python3 中被命名为 str。在 Python3 中使用 ·str 来代替 Python2 中的 unicode.
24、NameError: name 'ImageTK' is not defined
from tkinter import *
from PIL import Image, ImageTk
win = Tk() # 创建窗口对象
win.title("我的窗口") # 设置窗口标题
lab1 = Label(win, text = '你好', anchor = 'nw') # 创建Label组件
lab1.pack() # 显示Label组件
# 显示内置的位图
lab2 = Label(win, bitmap = 'question') # 创建显示疑问图标的Label组件
lab2.pack() # 显示Label组件
# 显示自选的图片
bm = ImageTK.PhotoImage(file = r'turtle.jpeg')
lab3 = Label(win, image = bm)
lab3.bm = bm
lab3.pack() # 显示Label组件
win.mainloop()
网上的代码,https://blog.csdn.net/username666/article/details/113615073,是真的坑。
直接拷贝运行,然后报错:NameError: name 'ImageTK' is not defined。
百度了一半天才找到原因:https://www.5axxw.com/questions/content/arxnni 原来是字母的大小写问题,这个需要着重注意一下。
25、Python 有三元运算符吗
Python 中没有 ?: 运算符,但是从版本 2.5 开始,加入了对三目运算符的语法支持,语法格式为:表达式1 if 布尔表达式 else 表达式2。
26、python没有提供求平均数的函数,建议先求和然后除以个数求得。
import numpy as np
np.mean([1, 2, 3])
27、TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
函数中报错出现NoneType,可以查看函数体中是否有返回None的情况, 一般是忘写return所致。
参考:https://blog.csdn.net/qq_45816346/article/details/122718132
28、ValueError: not enough values to unpack (expected 2, got 0)
开始发现linux能正常运行,原来是由于python2的缘故。
[root@ubuntu0006:/media/hankin/vdb/study] #python3 amazing_zip_error.py
******** starting ********
[103, 107, 113, 121]
process spend 0.0 s.
[root@ubuntu0006:/media/hankin/vdb/study] #
[root@ubuntu0006:/media/hankin/vdb/study] #python amazing_zip_error.py
******** starting ********
Traceback (most recent call last):
File "amazing_zip_error.py", line 73, in <module>
main()
File "amazing_zip_error.py", line 66, in main
amazing_map_error()
File "amazing_zip_error.py", line 59, in amazing_map_error
list_result = map(lambda x,y,z : x**2 + y + z, listx, listy, listz)
File "amazing_zip_error.py", line 59, in <lambda>
list_result = map(lambda x,y,z : x**2 + y + z, listx, listy, listz)
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
29、SyntaxError: Non-ASCII character '\xe8' in file amazing_zip_error.py on line 8, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
根据错误提示,尝试首行添加:
# -*- coding: utf-8 -*-
解决。
30、UnicodeEncodeError: 'latin-1' codec can't encode characters in position 28-32: ordinal not in range(256)
百度了一下,都是让我转编码格式,但是我的场景是使用pylupdate5进行中英文翻译,这让我咋转。
后面我直接删掉所有中文,结果运行还是报这个错,我才发现不是当前文件中的问题。
最终报错的地方,打开pylupdate_main.py文件发现:
(base) D:\Github\Storage\qt\python\中英文翻译>pylupdate5 test.py -ts english.ts
Traceback (most recent call last):
File "C:\Users\Administrator\Anaconda3\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "C:\Users\Administrator\Anaconda3\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Users\Administrator\Anaconda3\lib\site-packages\PyQt5\pylupdate_main.py", line 239, in <module>
main()
File "C:\Users\Administrator\Anaconda3\lib\site-packages\PyQt5\pylupdate_main.py", line 225, in main
translate_func)
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 28-32: ordinal not in range(256)
fetchtr_py(fi.absoluteFilePath(), fetchedTor, defaultContext, True, codecForSource, tr_func, translate_func)
文件的绝对路径,我才恍然大悟,是我的中文路径问题。
31、成功解决TypeError: ‘float‘ object cannot be interpreted as an integer
在使用Python的for w in range(0.0, 4.1, 0.1):时遇到报错:TypeError: 'float' object cannot be interpreted as an integer
为什么会出现这种错误呢?因为Python的函数range(start, stop[, step])中start,stop,step都是整数,当使用了小数就会报错。
import numpy
for i in numpy.arange(0.0, 4.1, 0.8):
print(i)
#输出结果:
0.0
0.8
1.6
2.4000000000000004
3.2
4.0
会出现精度丢失问题,计算机中所有的数据最终都是以二进制的形式存储的,小数在转换为二进制表示的时候会出现位数无限循环的情况,所以只能存储有限位数,超过这个长度的位数会被舍去(会采用 0舍1入 的方式),这样就造成了精度丢失的问题。
32、解决RecursionError: maximum recursion depth exceeded while calling a Python object
Python默认递归调用深度为1000(即最多递归调用1000次),而程序在运行过程中超过最大的递归深度。
import sys # 导入sys模块
sys.setrecursionlimit(3000) # 将默认的递归深度修改为3000
def infinite_lock_windows():
"""无限锁屏
"""
while True:
user = ctypes.windll.LoadLibrary("user32.dll")
user.LockWorkStation()
infinite_lock_windows()
time.sleep(30) # 应该把这行放在上面一行
33、python 报错 SyntaxError: EOL while scanning string literal 问题原因 解决方案 EOL解释
EOL = End Of Line error(翻译:行尾误差) 问题原因:通常是字符串两端的引号未正确匹配、成对造成的。
def set_wallpaper():
path = os.listdir(r'C:\Users\Administrator\Downloads\picture')
for i in path:
print(i)
# 原因在于这一行少写一个\,这个是个转义字符
img_path = r'C:\Users\Administrator\Downloads\picture' + '\\' + i
print(img_path)