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)   # 使用小括号,是方法
del lists[2]  # 索引号

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方法,需要另传参数

 

posted @   间歇性努力  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示