Python自用记录
1、python规范
踩坑记录:
1: 类或函数定义后,上下应有2空行
2: 运算符两边加上空格,比如 “=”
3: l = get_size() 复制时,有提示ambiguous variable name 'l'
(变量名 'l’不明确)
解决:应避免使用字符l,O,I来作为变量名,因为这些字符容易使人与数字1,0混淆
4: #获取屏幕尺寸,注释左边内容提示:block comment should start with #
解决:注释时,#后加空格“# 获取屏幕尺寸”
5: driver.swipe(x1,y1,x1,y2,1000),代码提示:missing whitespace after","
(",“后面缺少空格)
解决:”,"后加空格,driver.swipe(x1, y1, x1, y2, 1000)
6: too many blank lines ( 3 ) ,上下行空行太多,超过2行会有此提示
7: print (‘yes’) ,提示whitespace before "("
解决:括号前有空格,去掉空格即可
8: 提示no newline at end of file
,因为文件结尾没有换行符,末尾换行即可
9: print(“His height is %f “% 1.833) ,提示:missing whitespace around operator
(操作符周围缺少空格)
解决:(”%)改为(” % )即可
10: class test6 创建类是提示Class names should use Camelcase convention
(类名应使用camelcase约定)
解决:类名首字母大写,test6 改为 Test6
11: 函数内定义变量Threads = [],提示:Variable in function should be lowercase
(函数中的变量应为小写)
解决:变量首字母小写 threads = []
12: def t():
函数内有变量为t
,提示:Shadows name ' t' from outer scope
(来自外部作用域的阴影名称“t”),函数内部的变量,如果和函数被调用的外部的变量一样的话,就被PyCharm中叫做shadows name
这样的话,容易引发不容易觉察到的,由于函数内部和外部的变量名一致而引发的一些问题,所以保证确保函数内部和外部的变量名不要重复即可
解决:函数def t()
改为def th()
或修改函数内部变量名称
收集记录:
¥ 右括号前不要加空格
¥ 逗号、冒号、分号前不要加空格
¥ 函数的左括号前不要加空格。如Func(1)
¥序列的左括号前不要加空格。如list[2]
¥ 操作符左右各加一个空格,不要为了对齐增加空格
¥ 函数默认参数使用的赋值符左右省略空格
¥ if/for/while语句中,即使执行语句只有一句,也必须另起一行
2、time模块
1、获取当前时间
from datetime import datetime
print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
datetime.utcnow():当前时间
strftime(’%Y-%m-%d %H:%M:%S.%f’)[:-3]:格式化时间格式,且后三位数字不展示
#输出:
2019-07-01 06:13:35.306
2、格式化
import datetime
now = datetime.datetime.now()
print(now.strftime('%Y'+'%m'+'%d'+'_'+'%H'+'%M'+'%S'))
#输出:
20190711_135732
3、补充
import datetime
now = datetime.datetime.now()
#假设时间为:2013年9月17日21点10分6秒
now.strftime('%Y')
'2013'
now.strftime('%y')
'13'
now.strftime('%H')
'21'
now.strftime('%M')
'10'
now.strftime('%S')
'06'
3、等待
# 1
from time import sleep
sleep(0.5) #等待0.5秒
sleep(1) #等待1秒
#2
import time
time.sleep(0.5)
# 还可以把它赋给一个本地的名称
x = time.sleep
x(1) # 与time.sleep(1)效果一样
使用时机: 一般等待页面加载完成时使用
4、 print格式化输出(%占位)
# %s打印字符串
# %s占位 , % 后面内容输出在占位%s位置
print("His name is %s, he is boy !" % "Aviad")
name = Aviad
print("His name is %s, he is boy !" % name)
#输出结果:
His name is Aviad, he is boy !
His name is Aviad, he is boy !
# %d打印整数
print("He is %d years old " % 2)
#输出结果:
He is 2 years old
# %f打印浮点数
print("His height is %f " % 1.833)
print("His height is %.2f " % 1.833) # %.2f 指定保留小数点后2位数
#输出结果:
His height is 1.833000
His height is 1.83
#以下方法对%s,%d,%f都有效
#%2s意思是字符串长度为2,当原字符串的长度超过2时,按原长度打印,所以%2s的打印结果还是Aviad
print("His name is %2s, he is boy !" % "Aviad")
#输出结果:
His name is Aviad, he is boy !
#%7s意思是字符串长度为7,当原字符串的长度小于7时,在原字符串左侧补空格
print("His name is %-7s, he is boy !" % "Aviad")
#输出结果:
His name is Aviad, he is boy !
#%-7s意思是字符串长度为7,当原字符串的长度小于7时,在原字符串右侧补空格
print("His name is %-7s, he is boy !" % "Aviad")
#输出结果:
His name is Aviad , he is boy !
5、模块导入
test6.py 代码如下:
x = "tester"
def name():
print("test6")
name()
# 执行文件本身test6.py 输出为:
test6
test7.py 代码如下:
from test6 import x
def boy():
print('he is a ' + x)
boy()
# 执行文件本身test7.py 输出为:
test6
he is a tester
结论:可以看到 test7.py 只调用了 test6.py 中变量x,但是 test7.py 执行时输出了 test6.py 中name()
,因为一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
test6.py 代码修改:
x = "tester"
def name():
print("test6")
if __name__ == '__main__':
name()
此时执行 test7.py 输出如下:
he is a tester
所以,if __name__ == '__main__'
的意思是:当.py文件被直接运行时,if __name__ == '__main__'
之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'
之下的代码块不被运行。
6、类
1、 创建Student类,类名首字母大写,(Object)表示该类从哪个类继承下来的,Object类是所有类都会继承的类
class Testers(object):
pass
2、 实例:定义好了类,就可以通过Student类创建出Student的实例,创建实例是通过类名+()实现:
testers = Testers()
3、 类起模板的作用,创建的同时可以添加必需的属性。使用内置方法__init__,比如在创建Testers类时,把name、age属性绑上去
class Testers(object):
def __init__(self, name, age):
self.name = name
self.age = age
# 上方代码中,self就是指类本身,self.name就是Testers类的属性变量,是Testers类所有。
# name是外部传来的参数,不是Testers类所自带的。
# self.name = name的意思就是把外部传来的参数name的值赋值给Testers类自己的属性变量self.name
def hello(self):
print('hello %s ,your age is %s' % (self.name, self.age))
# 在类中定义函数只有一点不同,就是第一参数永远是类的本身实例变量self,并且调用时,不用传递该参数。
# 除此之外,类的方法函数和普通函数没啥区别,你既可以用默认参数、可变参数或者关键字参数
# 这些封装数据的函数是和Testers类本身是关联起来的,称之为类的方法
# 补充:*args是可变参数,args接收的是一个tuple,**kw是关键字参数,kw接收的是一个dict
testers = Testers('luye', 18)
print(testers.name)
print(testers.age)
testers.hello()
# 输出结果:
luye
18
hello luye ,your age is 18
注意:
- __init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
- 有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去。
- 在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
- 以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
6、logging模块报错
报错信息:AttributeError: module 'logging' has no attribute 'basicConfig
导致原因: 创建的Python文件取名logging,和系统提供的logging模块重名导致了该报错.
解决方法: 修改.py文件名
---------------------------------------------------------------------------------------------------------------------
报错信息: TypeError: Level not an integer or a valid string: <function info at 0x0000027613AE1E18>
导致原因: 代码中(logging.basicConfig(level=logging.info))关键字info应该为大写
import logging
logging.basicConfig(level=logging.info)
logging.debug('debug info')
logging.info('hello 51zxw !')
logging.warning('warning info')
logging.error('error info')
logging.critical('critical info')
解决方法: info改为INFO
7、open() 函数:打开文件,并返回文件对象
函数说明:
Python open() 函数用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 函数一定要保证关闭文件对象,即调用 close() 函数。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode='r')
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
file
: 必需,文件路径(相对或者绝对路径)。
mode
: 可选,文件打开模式
buffering
: 设置缓冲
encoding
: 一般使用utf8
errors
: 报错级别
newline
: 区分换行符
closefd
: 传入的file参数类型
opener
:
mode 参数有:
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(不推荐)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
默认为文本模式,如果要以二进制模式打开,加上 b 。
实例
测试文件 test.txt,内容如下:
RUNOOB1
RUNOOB2
f = open('test.txt')
f.read()
# 输出:
'RUNOOB1\nRUNOOB2\n'
open(“C:\Users\Spirit\Desktop\bc.txt”,‘r’) #会报错
由于python中的 ‘\’ 是转义符号,要想输出\ 的办法有两种:
1 、在\后再加\ 就是\ 的形式
把第二行改为infile =open(“C:\Users\Spirit\Desktop\bc.txt”,‘r’) 即可
2、在路径前加个 r ,意思是按原始字符处理 。
eg: infile =open(r"C:\Users\Spirit\Desktop\bc.txt",‘r’)
好的 文件就可以读取了!
8、format():字符串格式化填充
string字符串类型的内建函数,用于对字符串进行格式化填充,并返回处理后的字符串
# {}中无数字时起占位作用,传值按顺序从0开始升序
str = '一个篮子{}个鸡蛋,{}个篮子有{}个鸡蛋'
str.format(3,4,3*4)
# {}中有数字时,代表下标
str = '一个篮子{2}个鸡蛋,{1}个篮子有{0}个鸡蛋'
str.format(3*4,4,3)
# 输出结果一致:
一个篮子3个鸡蛋,4个篮子有12个鸡蛋
9、美化json
import json
yhfc = {"测试": 1, "前端": 1, "后端": 2, "UI": 1}
print(json.dumps(yhfc))
print(json.dumps(yhfc, indent=4)) # indent 美化输出时缩进占位数
print(json.dumps(yhfc, indent=4, ensure_ascii=False))
# ensure_ascii默认为True,utf-8格式非ASCII编码内容会被编译成ASCII编码输出,要想得到字符的真实表示,需要设置为False
#输出:
{"\u6d4b\u8bd5": 1, "\u524d\u7aef": 1, "\u540e\u7aef": 2, "UI": 1}
{
"\u6d4b\u8bd5": 1,
"\u524d\u7aef": 1,
"\u540e\u7aef": 2,
"UI": 1
}
{
"测试": 1,
"前端": 1,
"后端": 2,
"UI": 1
}
10、range():产生一个正整数列表
range(起始值,结束值,低增值)
起始值:可不填写,默认值为0
低增值:可不填写,默认值为1
range(100):0~99的整数
range(1,100):1~99的整数
11、random():产生随机数据
import random
random.random() # 0-1的随机浮点数
random.rangint(a,b) # 最小值a-最大值b区间的整数
random.randrange(a,b,c) # 最小值a-最大值b区间按照c递增的整数
random.choice(a) # 从集合a中随机获取一个元素,a可以是字符串、元组、列表
12、assert、isinstance()
import time
def i_want_to_sleep(delay):
assert(isinstance(delay, (int,float))), '函数参数必须为整数或浮点数'
print('开始睡觉')
time.sleep(delay)
print('睡醒了')
if __name__ == '__main__':
i_want_to_sleep(1) # True
i_want_to_sleep("666") # False
'''
isinstance() 方法的语法: isinstance(object, classinfo)
参数:
object -- 实例对象。
classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
返回值:
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
'''
666、常用
s1 = {"1": 1, "2": "c"}
print(len(s1))
# 2