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()

#假设时间为:201391721106秒
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.5sleep(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

注意:

  1. __init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
  2. 有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去。
  3. 在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
  4. 以一个下划线开头的实例变量名,比如_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

猜你喜欢

转载自blog.csdn.net/qq_38123721/article/details/94389694