python中一些常见的问题

1.为什么import 调用的模块 在pycharm中 会有红色的波浪线?

是因为该模块为第三方库,你未导入,进行导入就可以了,一般用pip指令导入比较方便

2.为什么用import 调用模块有的’import’显示灰色,有的显示高亮?

灰色是表示没有用到这个模块里的任何一个东西,可以把这一行去掉的。

3.selenium的使用

1.运行报错:

1
2
driver = webdriver.chrome()
TypeError: 'module' object is not callable

​ 解决方案:浏览器的名称需要大写,即Chrome和Firefox

2.selenium中安装chrome浏览器驱动(chomedriver)

​ 1.下载对应版本的chromedriver 下载地址:点这里

选择需要的浏览器驱动版本,点击**notes.txt**可以查看当前版本支持的浏览器版本,确定是否下载。

​ 2.解压复制chromedriver.exe到chrome浏览器的安装目录(C:\Program Files (x86)\Google\Chrome\Application)

​ 如果找不到此文件夹就将此文件解压到和你py文件同一个文件夹下,正常启动即可。

​ 3.启动脚本,浏览器正常打开

​ 使用格式 driver = webdriver.Chrome()

4.try -except 异常处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  try:
A
except:
B
except会捕获所有异常,包括键盘中断和程序退出请求(用sys.exit()就无法退出程序了,因为异常被捕获了),因此慎用。

except Exception as e:可以捕获除与程序退出sys.exit()相关之外的所有异常
老版本的Python,except语句写作"except Exception, e",Python 2.6后应写作"except Exception as e",

except <异常名1,异常名2>:<数据>:捕获异常名1或者异常名2,及附加的数据库
例如:
try:
print (2/0)
except (IOError,ZeroDivisionError):
print( '类型异常')
1
2
3
4
5
6
7
8
关键字          关键字说明

raise 抛出/引发异常
try/except 捕获异常并处理
pass 忽略异常
as 定义异常实例(except IOError as e)
finally 无论是否出现异常,都执行的代码
else 如果try中的语句没有引发异常,则执行else中的语句

​ 常用异常名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
异常名    描述
AttributeError 调用不存在的方法引发的异常
EOFError 遇到文件末尾引发的异常
ImportError 导入模块出错引发的异常
IndexError 列表越界引发的异常
IOError I/O操作引发的异常,如打开文件出错等
KeyError 使用字典中不存在的关键字引发的异常
NameError 使用不存在的变量名引发的异常
TabError 语句块缩进不正确引发的异常
ValueError 搜索列表中不存在的值引发的异常
ZeroDivisionError 除数为零引发的异常

使用raise 引发异常几种方式:

raise 异常名
raise 异常名,附加数据
raise 类名

assert 简化了raise语句:
需要注意的是,assert语句一般用于开发时对程序条件的验证,只有当内置_debug_为True时,assert语句才有效。当Python脚 本以-O选项编译成为字节码文件时,assert语句将被移除。
但与raise语句不同的是,assert语句是在条件测试为假时,才引发异常。assert语言的一般形式如下:

assert<条件测试>,<异常附加数据>#其中异常附加数据是可选的

5.try-finally:异常处理

1.无论try语句中是否抛出异常,finally中的语句一定会被执行

1
2
3
4
5
6
7
8

try:
f = open("/tmp/output", "w")
f.write("hello")
#raise Exception("something wrong")
finally:
print("closing file")
f.close()

​ 不论try中写文件的过程中是否有异常,finally中关闭文件的操作一定会执行。由于finally的这个特性,finally经常被用来做 一些清理工作。

2.try块中包含break、continue或者return语句的,在离开try块之前,finally中的语句也会被执行。

1
2
3
4
5
6
7
8
def func1():
try:
print('a')
return 1
finally:
print('A')
return 2
print(func1())
1
2
3
4
运行结果为:
a
A
2

​ 再例如:

1
2
3
4
5
6
7
8
9
10
11
def func2():
try:
print('b')
raise IOError#指定引发异常
except IndexError:
print('B')
return 1
finally:
print('X')
return 3
print(func1())
1
2
3
4
运行结果为:
b
X
3

​ try中抛出的异常是IOError类型的,而except中定位的是IndexError类型的,try中抛出的异常没有被捕获到,所以except中 的语句没有被执行,但不论异常有没有被捕获,finally还是会执行,最终函数返回了finally中的返回值3。

​ 这里还可以看到另外一个问题。try中抛出的异常没有被捕获到,按理说当finally执行完毕后,应该被再次抛出,但finally里 执行了return,导致异常被丢失。
​ 可以看到在finally中使用return会导致很多问题。实际应用中,不推荐在finally中使用return返回。

6.def函数中的一些问题

1.返回值问题:

返回个数:(不涉及*args和**kwargs参数)

​ 0:返回None

​ 1:返回object

​ =>2:返回tuple

2.形参与实参问题:

问题1:

1
2
3
4
> > > > > > def text1(x,y):
> > > > > > print(x,y)
> > > > > > print(1,2)
> > > > > >

输出结果为:1,2
如果这样赋值:text1(y=1,x=2)#与形参顺序无关
则输出结果为:2,1
即如果你不指定赋值,它会默认与形参一一对应
你也可以 text1(1,y=2),但不可以text1(x=1,2)或text1(y=1,2).

问题2:

1
2
def text2(x,y=2):
print(x,y)

你可以给形参赋个初值
你就可以这样调用text2(1),输出结果为:1,2
因为你给y形参已赋初值,如果你调用时未给y赋值,它会默认y=2
如果你这样调用 text2(1,3),则输出结果为:1,3.

问题3:

问题1与问题2都是传参个数必须与形参个数相等
接下来写一种个数不用相等的方式

1
2
3
4
5
6
7
8
#*args:把N个位置参数转化为元组的形式
def text3(*args):
print(args)
text3(1)
text3(1,2,3)#或text3(*[1,2,3])
#则结果分别为:
1
(1,2,3) #以元组(tuple)的方式返回.
1
2
3
4
5
6
7
def text4(x,*args):
print(x)
print(args)
text4(1,2,3,4,5)
#则运行结果为:
1
(2,3,4,5)

另一种方式:#**kwargs:把N个关键字参数转化为字典的形式

1
2
3
4
5
def text5(**kwargs):
print(kwargs)
text5(name='Lihua',age=18,sex='M')
#运行结果为:
{'name':'Lihua','age'=18,'sex'='M'}#以字典的形式返回

注意:args和kwargs都必须放在最后

hey!baby,站住,点它!