测试开发之Python核心笔记(6):分支与循环

测试开发之Python核心笔记(6):分支与循环_第1张图片

6.1 分支

根据不同条件,进入到不同的处理逻辑逻辑中,条件判断使用if语句。条件判断最好是显性的,写的明明白白的。

6.1.1 两个分支

例如,取绝对值:

if x < 0:
    y = -x
else:
    y = x

再如,取两个数中的较小值,可以写在同一行:

smaller = x if x< y else y

上面取绝对值的代码也可以写在一行:

absolute= x if x>0 else -x

条件表达式用 in 或者not in可以大大简化代码,比如:

cmd = 'create'
if cmd in ('create', 'delete', 'update'):
    action = 'Do {}'.format(cmd)
else:
    action = 'Invalid choice.. try again'
print(action)

6.1.2 三个及以上分支

if id == 0:    
    print('red')
elif id == 1:    
    print('yellow')
else:    
    print('green')  

6.2 循环

6.2.1 for循环

for循环用于遍历可以迭代对象。可迭代对象包括:列表、元组、集合、字典、字符串等。如何判断一个对象是否可迭代呢?可以参考下面的方法:

from collections import Iterable
print(isinstance('abc', Iterable))  
print(isinstance(range(101), Iterable))
print(isinstance([1, 2, 3, 4], Iterable))
print(isinstance((1, 2, 3, 4), Iterable))
print(isinstance({
     "web": "selenium", "app": "Appium", "performance": "Jmeter"}, Iterable))
print(isinstance({
     "selenium", "Appium", "Jmeter"}, Iterable))

上面print语句将全部输出True,因为他们都是可迭代对象,都可以用for循环迭代。

下面看下for循环的语法

  • 列表、元组、集合

    • 遍历全部
    l = [1, 2, 3, 4]
    for item in l:    
        print(item)
    
    • 遍历一部分
    l = [1, 2, 3, 4, 5, 6, 7]
    for index in range(0, len(l)):
        if index < 5:
            print(l[index])
    
    • 既需要元素,又需要对应的索引
    l = [1, 2, 3, 4, 5, 6, 7]
    for index, item in enumerate(l):  # enumerate能返回列表的索引及对应的值
        if index < 5:
            print(item)
    
  • 字典

    • 遍历字典的键
    d = {
           'name': 'jason', 'dob': '2001', 'gender': 'male'}
    for k in d: 
        print(k)
    
    • 遍历字典的值
    for v in d.values():   
        print(v)
    
    • 遍历字典的键值对
    for k, v in d.items():   
        print('key: {}, value: {}'.format(k, v))
    
  • 字符串

将字符串中所有单词的首字母转成大写,其实就是实现内置的capwords函数:

run = "pytest will run all files of the form test_*.py or *_test.py in the current directory and its subdirectories. "
upper_run = []
for i in run.split(" "):
    upper_run.append(i.capitalize())
print(" ".join(upper_run))

上面的逻辑还可以写在一行上:

print(" ".join(x.capitalize() for x in run.split(" ")))
  • range函数

range函数在for循环语句中经常出现。它可以产生一系列的整数,来看下它的官方文档:

class range(object):
    """
    range(stop) -> range object
    range(start, stop[, step]) -> range object
    
    Return an object that produces a sequence of integers from start (inclusive) # 产生start到stop之间的一系列整数
    to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.  # 包含start,不包含stop
    start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
    These are exactly the valid indices for a list of 4 elements.
    When step is given, it specifies the increment (or decrement).  # step是步长,用来设置整数之间的间隔
    """

比如产生1~1000之间的整数的平方数:

for i in range(101):  # 所有整数的平方数
    print(i * i)

for i in range(0, 101, 2):  # 所有偶数的平方数
    print(i * i)

6.2.2 else从句

for循环还有一个else从句,我们大多数人并不熟悉。如果for循环正常结束,else中语句执行。如果for循环中执行了break语句,则不执行else语句。

当你用 for 循环迭代查找列表的中的某个元素时,如果找到了就立刻退出循环,如果迭代完了列表还没找到,需要以另外一种形式(比如异常)的方式通知调用者时,用 for…else… 无疑是最好的选择。

举个例子,找出2到10之间的数字的分解因子。如果是质数,则通过else语句块,告诉我们:

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print( n, 'equals', x, '*', n/x)
            break
    else:
        # loop fell through without finding a factor
        print(n, 'is a prime number')

质数n只能不能被2~n-1整除,因此if n % x == 0都不成立,for语句for x in range(2, n)会执行完毕,接着执行else语句将数字n打印出来。

这是for循环的else语句的最合适的用法。不用else语句的话,通常要设置一个标志位。for循环的else语句用的并不多。

for n in range(2, 10):
    is_prime = True
    for x in range(2, n):
        if n % x == 0:
            print(n, 'equals', x, '*', n / x)
            is_prime = False
            break
    if is_prime:
        print(n, 'is a prime number')

6.2.3 while循环

while 语句后面一般会添加一个表达式,当表达式为True时,一直循环。

count=0
while count<9:  # 当count<9为True时执行循环体,当为False时终止循环
    print("count is ", count)
    count+=1

还有一种表达式是标志位,例如

flag = True  
while flag:
  try:
      text = input('Please enter your questions, enter "q" to exit')
      if text == 'q':
          flag = Flase  # 在某种条件下改变flag,退出循环
          print('Exit system')
      print(text)
  except Exception as err:
      print('Encountered error: {}'.format(err))
      break

如果条件永远为True,则是无限循环,常用在服务器等到客户端的请求场景下:

while True:
	handle, request = wait_for_client()
	process(request)

6.2.4 该用哪种?

  • 如果只是遍历一个已知的集合,找出满足条件的元素,并进行相应的操作,那么使用 for 循环更加简洁。
  • 但如果需要在满足某个条件前,不停地重复某些操作,并且没有特定的集合需要去遍历,那么一般则会使用 while 循环。
  • for 循环的效率更胜一筹。

6.2.5 终止循环

  • continue

    让程序跳过当前这层循环,继续执行下面的循环。

    for name, price in name_price.items():
        if price >= 1000:
            continue
        if name not in name_color:
            print('name: {}, color: {}'.format(name, 'None'))
            continue
        for color in name_color[name]:
            if color == 'red':
                continue
            print('name: {}, color: {}'.format(name, color))
    
  • break

    完全跳出所在的整个循环体。

    l = [1, 2, 3, 4, 5, 6, 7]
    for index in range(0, len(l)):
        print(l[index])
        if index > 5:
            break
    

6.3 练习题

  1. 打印乘法表

外层循环一次,print(),换行;内层循环一次,打印一个等式。

def mul_table():
    for i in range(1, 10):
        for j in range(1, i + 1):
            print(str(j) + str("*") + str(i)+"=" + str(i*j), end="\t")
        print()

if __name__ == '__main__':
    mul_table()
  1. 编写一个程序。输入三个数字,start,end和step。输出包含start和end在内,步长为step的数字。
def my_range(start, end, step):
    return range(start, end + 1, step)
  1. 判断一个数是否是完全数。完全数指的是,它的约数(不包含它本身)之和是它本身。比如6,它的约数是1,2,3,它们的和是它本身。
def isperfect(num):
    factors = []
    for i in range(1, num):
        if num % i == 0:
            factors.append(i)
    return sum(factors) == num
  1. 写一个函数返回一个数字的阶乘。一个数字的阶乘指的是从1到这个数字之间所有数字的乘积。
def factorial(num):
    result = 1
    for i in range(1, num + 1):
        result *= i
    return result
  1. 求斐波那切数列中第n个元素的值。
def fibonacci_recursive(n):
    if n < 0:  # 递归终止条件
        return 0
    if n in [1, 2]:  # 递归终止条件
        return 1
    return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)  # 递归公式


def fibonacci_loop(n):
    a, b = 0, 1
    while n > 0:
        a, b = b, a + b
        n -= 1
    return a


def fibonacci_generator(n):
    a, b = 0, 1
    yield a
    while n > 0:
        a, b = b, a + b
        n -= 1
        yield a


if __name__ == '__main__':
    for i in range(10):
        print(fibonacci_recursive(i), end='\t')

    for i in range(10):
        print(fibonacci_loop(i), end='\t')
    print(list(fibonacci_generator(10)))

你可能感兴趣的:(Python,python)