1,Python 中类的成员函数必须有一个参数 self, 而且位于参数列表的开头. self 就代表类的实例 (对象) 自身, 可以使用 self 引用类的属性和成员函数.
2,Python 使用下划线作为变量前缀和后缀来指定特殊变量, 规则如下:
__XXX__表示系统定义名字 (以两个下划线开头和以两个下划线结束)
__XXX 表示类中的私有变量名
3,Python 的构造函数:__init__(函数名以两个下划线开头和以两个下划线结束)
析构函数,__del__(), 通常在析构函数中释放类所占用的资源.
使用 del 语句删除一个对象, 释放它所占用的资源. 如:
del s #删除对象
4,Python 的静态变量不需要显示定义, 任何公有变量可以当做静态变量使用. 可以通过类名或是对象名访问 (调用) 静态变量, 两者对同一个变量的调用不互相干扰.
5, 序列解包: 将序列中存储的值指派给哥哥变量
6,Pycharm 中灯泡的含义
黄色灯泡意味着 Pycharm 对你当前编写的代码提出了一些建议, 此时的程序并没有什么错误, 但是可以对其进行一些改进, 例如添加几行说明文档等等. 另外一个作用就是创建使用源, 比如当你使用了一个尚不存在的函数, Pycharm 会通过这种方式来提醒你去创建它.
红色灯泡则意味着 Pycharm 发现当前代码中存在错误而给出的修正建议, 例如需要导入缺失的第三方库, 源文件丢失等等. Pycharm 会给出快捷方便的纠错提醒.
7,Python-Selenium 三种等待方式(参考例子: http://www.jb51.net/article/92672.htm )
1)强制等待
- from time import sleep
- sleep(3) # 强制等待 3 秒再执行下一步
2)隐性等待
from selenium import webdriver driver.implicitly_wait(30) # 隐性等待, 最长等 30 秒
隐形等待是设置了一个最长等待时间, 如果在规定时间内网页加载完成, 则执行下一步, 否则一直等到时间截止, 然后执行下一步.
3)显性等待
WebDriverWait, 配合该类的 until()和 until_not()方法, 就能够根据判断条件而进行灵活地等待了. 它主要的意思就是: 程序每隔 xx 秒看一眼, 如果条件成立了, 则执行下一步, 否则继续等待, 直到超过设置的最长时间, 然后抛出 TimeoutException.
8,WebDriver 工作原理
是按照 Server-Client 的模式设计的
Server 端是 Remote Server, 可以看做是任意浏览器, 它的作用是等待 Client 发送请求并作出反应
Client 端可以看做是测试的代码, 它是以 http 请求的方式发送给 Remote Server(浏览器).Remote Server 接受请求, 执行相应操作, 并在 Response 中返回执行状态, 返回值等信息.
9, 编译和解释的区别是什么?
编译器是把源程序的每一条语句都编译成机器语言, 并保存成二进制文件, 这样运行时计算机可以直接以机器语言来运行此程序, 速度很快;
而解释器则是只在执行程序时, 才一条一条的解释成机器语言给计算机来执行, 所以运行速度是不如编译后的程序运行的快的.
这是因为计算机不能直接认识并执行我们写的语句, 它只能认识机器语言(是二进制的形式)
编译是将源程序翻译成可执行的目标代码, 翻译与执行是分开的; 而解释是对源程序的翻译与执行一次性完成, 不生成可存储的目标代码. 这只是表象, 二者背后的最大区别是: 对解释执行而言, 程序运行时的控制权在解释器而不在用户程序; 对编译执行而言, 运行时的控制权在用户程序.
10,
% 运算符就是用来格式化字符串的. 在字符串内部,%s 表示用字符串替换,%d 表示用整数替换, 有几个 %? 占位符, 后面就跟几个变量或者值, 顺序要对应好. 如果只有一个 %?, 括号可以省略,%% 来表示一个 %.
常见的占位符有:
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
11, 为何设计不变对象
设计 str,None 这样的不变对象, 因为不变对象一旦创建, 对象内部的数据就不能修改, 这样就减少了由于修改数据导致的错误. 此外, 由于对象不变, 多任务环境下同时读取对象不需要加锁, 同时读一点问题都没有.
12, 关键字参数有什么用? 它可以扩展函数的功能. 比如你正在做一个用户注册的功能, 除了用户名和年龄是必填项外, 其他都是可选项, 利用关键字参数来定义这个函数就能满足注册的需求.
任意函数, 都可以通过类似 func(*args, **kw)的形式调用它, 无论它的参数是如何定义的.
13, 在计算机中, 函数调用是通过栈 (stack) 这种数据结构实现的, 每当进入一个函数调用, 栈就会加一层栈帧, 每当函数返回, 栈就会减一层栈帧. 由于栈的大小不是无限的, 所以, 递归调用的次数过多, 会导致栈溢出.
尾递归是指, 在函数返回的时候, 调用自身本身, 并且, return 语句不能包含表达式. 这样, 编译器或者解释器就可以把尾递归做优化, 使递归本身无论调用多少次, 都只占用一个栈帧, 不会出现栈溢出的情况.
14, 判断一个对象是可迭代对象呢? 通过 collections 模块的 Iterable 类型判断, 例如
>>> from collections import Iterable>>> isinstance('abc', Iterable) # str 是否可迭代 True
15,Python 内置的 enumerate 函数可以把一个 list 变成索引 - 元素对, 这样就可以在 for 循环中同时迭代索引和元素本身, 例如
- for i, value in enumerate(['A', 'B', 'C']): ... print(i, value)
- 16,
1), 布尔值有大小写区分, true 和 TRUE 和 True 都不同
2), 字符串常量使用单引号 (') 或双引号 ("") 括起来
3), 使用反斜杠 (\) 作为转义字符, 例如:\n, 换行;\r, 回车;\\,\;\(在行尾时), 续行符;
4),Python 表示 Unicode 字符的方法, 在字符串前面加上 u 或 U 前缀即可, 如 u"我是 ****"
5), 采用索引运算法 [] 和切片运算法 [:] 截取字符串中的子字符串. 使用切片运算法截取是从指定开始位置和戒指位置之间的子字符串索引值 a 从 0 开始. 返回从 a 开始到 b-1 的子字符串, 若 a 不指定, 则默认为 0
17, 编译时会出现这样的错 IndentationError:expected an indented block 说明此处需要缩进, 你只要在出现错误的那一行, 按空格或 Tab(但不能混用)键缩进就行.
18, 项目开发中, 集合主要用在数据元素的去重和测试是否存在
19,Python 中的对象有不可变对象, 指的是数值, 字符串, 元组等, 和可变对象, 指的是列表, 字典等. 如果是不可变对象作为参数, 相当于是值的传递, 函数中对该参数的修改不会保留. 如果是可变对象, 则相当于传引用, 函数中的修改会保留.
20, 静态方法的应用场景是当一个函数完全可以放到类外面单独实现的时候, 如果这个函数和类还有一点联系, 那么放入类中能更好的组织代码逻辑, 那么可以考虑使用类中的静态方法
静态方法用 @staticmethod 装饰
静态方法用类名调用
21,property 可以将方法变成一个属性来使用, 借助 property 可以实行 Python 风格的 getter/setter, 即可以通过 property 获得和修改对象的某一个属性.
- @property
- def name(self):
- return self._name
- @name.setter
- def name(self, value):
- self._name = value
调用
- cat = Cat('Kitty')
- print(cat.name)
22,split()就是将一个字符串分裂成多个字符串组成的列表.
split()当不带参数时以空格进行分割, 当代参数时, 以该参数进行分割. 分裂后返回一个列表
当不带参数时, 默认是以空格作为参数
23,sys.argv[]是用来获取命令行参数, 返回值是一个列表
第一个参数 (sys.argv[0]) 是程序本身, 随后才是外部给予的参数
24, 能被 for 循环访问的都是可迭代的对象, 能被 next() 函数获取下一个值的是迭代器.
25 with lock 语句是对下面语句的简写:
- # lock.acquire()
- # val.value += 1
- # lock.release()
26,Python 内置的 @property 装饰器就是负责把一个方法变成属性调用的
例如
class Student(object): @property def score(self): return self._score @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value <0 or value> 100: raise ValueError('score must between 0 ~ 100!') self._score = value
把一个 getter 方法变成属性, 只需要加上 @property 就可以了, 此时,@property 本身又创建了另一个装饰器 @score.setter, 负责把一个 setter 方法变成属性赋值, 于是, 我们就拥有一个可控的属性操作:
>>> s = Student()>>> s.score = 60 # OK, 实际转化为 s.set_score(60)>>> s.score # OK, 实际转化为 s.get_score() 60>>> s.score = 9999 Traceback (most recent call last): ... ValueError: score must between 0 ~ 100!
27,os.path.join(): 将多个路径组合后返回
28,os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表. 这个列表以字母顺序. 它不包括 '.' 和'..' 即使它在文件夹中. 只支持在 Unix, Windows 下使用
os.listdir(path)
29,JSON(JavaScript Object Notation, JS 对象标记)是一种轻量级的数据交换格式.
dumps 和 loads 分别执行了序列化和反序列化的操作, 并且 JSON 序列化后的内容为字符串, 所以文本写入和读取不需要用二进制格式
- with open('courses.json', 'w') as file:
- file.write(JSON.dumps(courses))
- with open('courses.json', 'r') as file:
- new_courses = JSON.loads(file.read())
30, 关于 python 中带下划线的变量和函数 的意义 http://www.cnblogs.com/wangshuyi/p/6096362.html
总结:
变量:
1. 前带__的变量: 标明是类中的私有变量, 只有类对象和子类对象能访问( 外部类可以通过特定方法访问该变量)
_xxx 不能用'from module import * 导入" 单下划线 "开始的成员变量叫做保护变量, 意思是只有类对象和子类对象自己能访问到这些变量;" 双下划线 " 开始的是私有成员, 意思是只有类对象自己能访问, 连子类对象也不能访问到这个数据.
以单下划线开头 (_foo) 的代表不能直接访问的类属性, 需通过类提供的接口进行访问, 不能用 "from xxx import *" 而导入; 以双下划线开头的 (__foo) 代表类的私有成员; 以双下划线开头和结尾的 (__foo__) 代表 python 里特殊方法专用的标识, 如 __init__()代表类的构造函数.
2. 前带两个_ , 后带两个_ 的变量: 标明是内置变量, 系统定义的名字
3. 大写加下划线的变量: 标明是 不会发生改变的全局变量
函数:
1. 前带_的变量: 标明是一个私 有函数, 只用于标明,
2. 前带两个_ , 后带两个_ 的函数: 标明是特殊函数
总结:
_x: 单前置下划线, 私有化属性或方法, from somemodule import * 禁止导入, 类对象和子类可以访问 __xx: 双前置下划线, 避免与子类中的属性命名冲突, 无法在外部直接访问(名字重整所以访问不到) __xx__: 双前后下划线, 用户名字空间的魔法对象或属性. 例如:__init__ , __ 不要自己发明这样的名字 xx_: 单后置下划线, 用于避免与 Python 关键词的冲突
31, 在 Ipython 中, 输入 "!+shell 命令", 可以执行 shell 命令
例如: 输入: !ls 查看当前目录下有哪些文件
32,__init__ , __new__ 和 __call__等方法的联系
实例化一个对象后,__new__方法先被调用, 返回一个实例对象, 接着 __init__ 被调用. __call__方法并没有被调用.__init__负责对象的初始化.__new__ 方法的返回值就是类的实例对象, 这个实例对象会传递给 __init__ 方法中定义的 self 参数, 以便实例对象可以被正确地初始化. 但凡是可以把一对括号 () 应用到某个对象身上都可称之为可调用对象, 判断对象是否为可调用对象可以用函数 callable(对象), 如果在类中实现了 __call__ 方法, 那么实例对象也将成为一个可调用对象, 利用这种特性可以实现基于类的装饰器.
33, 蓝图(Blueprint)
一个蓝图定义了可用于单个应用的视图, 模板, 静态文件等等的集合.
介绍:
官网:
34,super
在类的继承中, 如果重定义某个方法, 该方法会覆盖父类的同名方法, 但有时, 我们希望能同时实现父类的功能, 这时, 我们就需要调用父类的方法了, 可通过使用 super 来实现
super 原理参见下面网址:
35,Python3 常见异常类
NameError 访问一个未定义的变量
SyntaxError 语法错误, 这个严格讲算是程序的错误
IndexError 对于一个序列, 访问的索引超过了序列的范围(序列的概念会在后续实验中讲到), 可以理解为我的序列里只有三个元素, 但要访问第 4 个
KeyError 访问一个不存在的字典 Key, 字典也会在下一节实验中详细讲到, Key 如果不存在字典就会抛出这个异常
ValueError 传入无效的参数
AttributeError 访问类对象中不存在的属性
来源: http://www.bubuko.com/infodetail-2985180.html