Selenium3自动化测试实战--第3章 Python基础1--输出,分支,循环,列组,元组,字典,函数,类和方法
3.1 Python哲学
shell模式,输入import this
3.2 输出
3.2.1 打印
print("my name is: "+name+",my age is:"+str(age))
print("my name is: %s, my age is: %d"%(name,age)) # 不确认用 %r
print("my name is:{}, my age is:{}".format(name,age)) # 推荐
print("my name is:{n},my age is:{a}".format(a=age,n=name))
print("my name is:{1},my age is:{0}".format(age,name))
print(sd + " " + ef, end="") # 不换行
3.2.2 引号和注释
不区分 单引号,和双引号
3.3 分支与循环
结构化程序实际上由 顺序,分支和循环三种基本结构组成。
3.3.1 if语句
if...else
if...elif...elif...else:
Python官网文档中,介绍if,就用到了input
int(input("please enter an integer:")) # 屏幕输入,这里为什么用int(),因为如果不用这个,即便输入一个int,但保存下来也是str
if d==1 or d==12: # 多个条件的判断时,可以用or
print('ok')
else:
print('fail')
if d==1|d==12: # 如果是int,可以用|符号,
print("ok")
else:
if d=='1'|d=='12': # 但其它的str,float全不能用,只能用or
print('ok')
3.3.2 for语句
for s in "hello":
print(s)
for i in range(5): # range(1,10,2) 起始位置,结束位置,步长
print(i)
list(range(-10,-100,-30)) # [-10,-40,-70]
list(range(-10,-100,30)) # [] 为什么是空,-10不符合条件?
list(range(-10,100,30)) # [-10,20,50,70]
list(range(-10,100,-30)) # [] 为什么也是空?
Python官网文档中提到:
遍历集合时修改集合的内容,会很容易生成错误的结果。因为不能直接进行循环,而是应遍历该集合的副本或创建新的集合:
# Create a sample collection, a dict
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}
# Strategy: Iterate over a copy
for user,status in users.copy().items(): # .copy()
if status=='inactive':
del users[user]
range()和len()组合在一起,可以按索引迭代序列:
a = ['Mary', 'had', 'a', 'little', 'lamb']
for i in range(len(a)):
print(i, a[i]) # 这里i和a[i]中间自动有了空格
0 Mary
3.3.3 循环中的break,continue语句及else子句
书中没有提到break, continue及循环语句支持else子句,但其实这几个还是很常用的,而且面试中也常问到。所以根据官方文档,做一下总结。
for循环中,可迭代对象中的元素全部循环完毕,或while循环的条件为假时,执行else子句;但break语句终止循环时,不执行else子句。
for n in range(2,10):
print("n=%d"%n)
for x in range(2,n):
print(" x=%d"%x)
if n % x ==0:
print(" ",n,'equals', x,'*',n//x)
break # break 会在条件符合后触发,去终止所属的第二层for循环,不执行else,而是开始新一轮的第一层循环
else: # 本else不属于if,而是第二层for循环,是第二层循环完成到最后没有触发break,就会执行else。
# 循环失败,即上面第二层循环从头循环到尾,没有符合条件(n%x==0),即没有找到一个因素
print(n, "is a prime number") # n是一个质数
print('')
continue语句,表示继续执行循环的下一次迭代
for n in range(2,10):
if n % 2 ==0:
print("Found an even number",n) # 偶数
continue # 继续下一次迭代,后面的语句不再执行
print("Found an odd number",n) # 奇数
如果将continue 改成pass,就会继续执行后面的语句。使用pass,和什么也不用,效果是一样的。
3.4 列表,元组,字典--序列类型
3.4.1 列表
定义 | 列表 lists=[] 方括号 | 元组tup=() 小括号 | 字典 dicts = {} 花括号 key:value | 集合 不重复元素组成的无序容器 花括号或set()函数 |
打印第5个元素 | print(lists[4]) | tup[4] # 根据索引指定元素,也是使用方括号[] | print(dicts.keys()) # 返回的不是列表,而是视图对象(python2时返回的是列表),不可修改print(dicts.values()) #可以使用list() 函数转换为 列表 print(dicts.items()) # 每个键值对组成的元组是list一个元素 ('username','zhangsan') ,见下图 |
创建空集合只能用set(),空{}创建的是空字典 |
打印最后一个元素 | print(lists[-1]) | tup[-1] | print(dicts['age']) # 指定键 的 值 | |
打印几个元素 或者叫 截取 |
print(lists[1:4]) #打印索引为1,2,3的3个元素 | tup[1:4] | for k,v in dicts.items(): print(k) print(v) for k in dicts.keys(): |
|
末尾 添加元素 | lists.append('c') | x | dicts['abc']='eee' # 如果键不存在,则不是修改,而是添加新键值对 | a-b 仅a中有的,不存在b中 |
指定位置 添加元素 | lists.insert(2,'a') # 索引,从0开始 | x | x | a | b a中和b中的 |
修改第5个元素 | lists[4]='b' | x | dicts['age']=23 | a & b a和b都有的 |
删除第2个元素 |
lists.pop(1) # 使用小括号,是方法 |
x | dicts.pop('zhangsan') # dicts做了删除键值对,但返回的值 del dicts['zhangsan'] # 官网所用 |
a ^ b a中和b中的,不不包含a &b |
连接 | lists3=lists1+lists2 | tup3=tup1+tup2 | x | |
复制 | lists2*3 #lists2不变 | tup3*4 # tup3不变 | x | |
排序 | lists.reverse() # 将Lists反向排序 lists.sort(cmp=None,key=None,reverse=False) reverse=False 升序 默认 True 降序 |
|||
列表是可变的,可追加,修改或删除其中元素 | 元组不可变 | key是独一无二的,value可相同 |
sort()方法按key排序
def takesecond(elem):
return elem[1]
random = [(2,2),(3,4),(4,1),(1,3)]
random.sort(key=takesecond)
print(random)
3.5 函数,类和方法
3.5.1 函数
def 定义函数
def add(a,b): # 定义函数 如果设置默认参数 def add(a=1,b=2),在调用时不加参数也不会报错
return a+b
c = add(2,3) # 调用函数
3.5.2 类和方法
面向对象编程,一切皆是对象。抽象的一组对象是 类,具有相同的属性和方法。用class关键字创建类。
# 定义MyClass类
class MyClass(object): # object是所有类的基类,所有类在创建时默认继续object,所以不声明object也可以 class MyClass:
"""A simple example class""" # """xxx""" 必须也有tab或空格
i = 12345
def say_hello(self,name): # 类里的函数定义一般是特殊的参数列表(是指必须有参数self?),这是由方法调用的约定规范所指明
"""b simple"""
return "hello," + name # 从(结尾处)正常离开类定义时,将创建一个 类对象
# 调用MyClass类 # 类对象支持两种操作: 属性引用(MyClass.say_hello) 和 实例化
mc = MyClass() # 类的实例化,使用函数表示法
print(mc.__doc__) # __doc__也是一个有效的属性
print(mc.say_hello("tom"))
print(mc.say_hello.__doc__) # 函数的__doc__,函数后面不要用括号()
实例对象所能理解的唯一操作就是属性引用。有两种有效的属性名称:数据属性和方法。
从这里,就知道,方法的概念: 方法是“从属于”对象的函数。根据定义,一个类中所有是函数对象的属性都是定义了其实例的相应方法。 x.f 与 MyClass.f 并不是一回事,它是一个 方法对象,不是函数对象。 而且 方法并不是类实例特有的。其它对象例如列表对象也有append,insert,remove,sort等方法。
我对这里的理解是,类中的函数是特殊的函数,是有特殊的参数(self)的函数。而方法,是类实例 做 属性引用 类的函数 时的讲法。
而该书中所说的 方法与函数的唯一区别是,类的下面创建一个add()方法,方法的第一个参数必须声明。但官网文档也提到了类中定义__init__方法。所以类下面叫函数还是方法都是差不多的,只是方法有特殊参数。
有时,创建类时会先声明初始化方法__init__() (即官方文档中提的,许多类喜欢创建带有特定初始状态的自定义实例,为此类定义可能包含一个名为__init__()的特殊方法。
继承
class A:
def __init__(self,a,b):
self.a=int(a)
self.b=int(b)
def add(self):
return self.a+self.b
count = A('4',5)
print(count.add())
class B(A): # B类继承A类
def sub(self,a,b):
return a-b
print(B(2,3).add()) # 所以B类也拥有add()方法
print(B(3,5).sub(4,8)) # 因为B类继承A类,在实例化时B类也必须有参数,用于add方法,而B类独有的sub方法,需要另传参数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!