视频

上午: https://ke.qq.com/webcourse/index.html#cid=2744006&term_id=102851992&lite=1&from=800021724&taid=34441698&vid=5285890806704506147

下午:https://ke.qq.com/webcourse/index.html#cid=2744006&term_id=102851992&lite=1&from=800021724&taid=34444456&vid=5285890806703860451


循环控制语句

for… esle

基本使用规则,当for循环运行完成之后,执行else中的语句;

  1. for x in range(3):
  2. print(x)
  3. else: # for 循环执行完毕之后进行的操作
  4. print('helloworld')
  1. 0
  2. 1
  3. 2
  4. helloworld

如果for循环被中断执行,那么else中的语句还会被执行吗?请看下列代码

  1. for x in range(3):
  2. if x == 2:
  3. break
  4. print(x)
  5. else: # for 循环执行完毕之后进行的操作
  6. print('helloworld')
  1. 0
  2. 1

如果for循环没有被执行完毕,则else语句中的代码体不再执行

练习

设计一个银行卡ATM取款程序验证密码程序,提示用户输入密码,默认密码为 8888

  1. 如果用户密码输入错误超过3次,结束程序,并提示用户密码错误3次,请明天再试。
  2. 如果密码正确,打印 欢迎信息,结束程序;
    1. p='8888'
    2. for i in range(3):
    3. passwd = input('请输入密码')
    4. if passwd == p:
    5. print('欢迎')
    6. break
    7. else:
    8. print('3次密码错误,请明天重试')

while…else

基本使用,与for循环类型,当循环执行完毕时候,会自动执行else中的语句;

  1. count = 1
  2. while count<4:
  3. print(count)
  4. count+=1
  5. else:
  6. print('while end...')
  1. 1
  2. 2
  3. 3
  4. while end...

如果while循环被中断,同样的else 中语句不执行;

  1. count = 1
  2. while count<4:
  3. print(count)
  4. count+=1
  5. if count == 2:
  6. break
  7. else:
  8. print('while end...')

请大家将上面ATM密码模拟程序使用While循环实现

  1. count=0
  2. while count<3:
  3. count+=1
  4. passwd = input('请输入密码')
  5. if passwd == "8888":
  6. print('欢迎')
  7. break
  8. else:
  9. print('3次密码错误,请明天重试')

求素数

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

列表推导式

使用for循环生成10个列表数据;

  1. users = []
  2. for i in range(10):
  3. users.append('testuser'+str(i))
  4. print(users)

使用列表推导式

  1. users = ['testuser'+str(i) for i in range(10)]
  2. print(users)

[]表示 生成数据为list
for i in range(10) 循环条件
“testuser”+str(i) 保存的数据

  1. xy= [(x,y) for x in [1,2,3] for y in [1,3,4] if x!=y]
  2. print(xy)

函数

定义基本函数

可以将具有特定功能代码封装到一起,形成函数。

  1. """
  2. 函数:
  3. def func():
  4. pass
  5. """

定义一个基本函数

  1. def f():
  2. pass

斐波那契数列可以使用函数的方式来定义

  1. def f():
  2. a,b = 0,1
  3. for i in range(10):
  4. a,b = b, a+b
  5. print(a,end=',')

函数定义好之后,一定要调用才能被执行;
调用函数的方式: 函数名()

  1. def f():
  2. a,b = 0,1
  3. for i in range(10):
  4. a,b = b, a+b
  5. print(a,end=',')
  6. f() # 调用函数
  1. # 斐波那契数列
  2. def fib():
  3. a,b = 0,1
  4. for i in range(10):
  5. a,b = b, a+b
  6. print(a,end=',')
  7. # 金字塔
  8. def pyramid():
  9. for x in range(1, 11):
  10. print(' ' * (11 - (x + 1)) + ((2 * x) - 1) * '*')

函数的参数

为函数设置参数,可以让函数功能更加灵活。设置方式为

  1. def f(arg):
  2. pass
  1. # 斐波那契数列
  2. def fib(num): # 添加参数,
  3. a,b = 0,1
  4. for i in range(num): # 调用函数的参数
  5. a,b = b, a+b
  6. print(a,end=',')
  7. print()
  8. fib(10) #给函数传参,传入 num=10
  9. fib(20) #传入20

函数的返回值

使用return 关键字可以将计算结果返回出来;

  1. def add(x,y):
  2. sum = x+y
  3. return sum
  4. print(add(1,2)) # 因为函数add 有返回值 打印出来的结果为返回的结果;
  1. def add(x,y):
  2. sum = x+y
  3. return sum
  4. s1 = add(1,2) # 3
  5. s2 = add(3,4) # 7
  6. print(add(s1,s2))

在函数中 执行到return语句,如果return下面还有代码体,则下面语句不再被执行;

  1. def f():
  2. return True
  3. print('helloworld') # 下面的helloworld 不会被打印出来
  4. f()

函数的必填参数

函数中定义参数 如果没有默认 则为必填参数;必填参数只要在函数中定义,不管在函数内部有没有被调用到都无所谓;但是在外部调用时候一定是有多少个参数,传多少个参数;

  1. def f(x,y,z):
  2. return True
  3. f('a') # f 函数定义了三个参数,所以在调用的时候也要传3个参数;

以上代码因为参数个数不够,所以会报错

  1. Traceback (most recent call last):
  2. File "C:/Users/zengy/PycharmProjects/untitled1/demo3.py", line 5, in <module>
  3. f('a')
  4. TypeError: f() missing 2 required positional arguments: 'y' and 'z'

函数参数的默认值

如果函数有默认值,传参的时候默认值处不传参,则使用默认值;如果传参,则会把默认值覆盖掉;

  1. def study(name,place="凡猫"):
  2. print(f'{name}在{place}学习Python自动化')
  3. # 如果函数中 参数有默认值,调用的时候不传参数。会自动使用默认值
  4. study('xiaoming') #xiaoming在凡猫学习Python自动化
  5. # 覆盖掉默认值
  6. study('xiaohong','Home') # xiaohong在Home学习Python自动化

注意: 在定义函数参数的时候,必填项参数一定要放在首位,有默认值的参数要放在后面,否则会报错;

  1. def study(place="凡猫",name):
  2. print(f'{name}在{place}学习Python自动化')

函数传参

定义的函数参数默认传参按照位置进行传参

  1. def study(name,place="凡猫"):
  2. print(f'{name}在{place}学习Python自动化')
  3. study('xiaoming')
  4. study('xiaoming',"Home")

也可以指定参数名进行传参

  1. study(name='xiaowang',place='Home')
  2. study(place='Office',name='xiwangm')

也可以第一个参数不指定参数名

  1. study('xiaohong',place='office')

注意:如果第一个参数传参的时候指定了参数名,那么后面的参数也都都需要指定参数名;否则会报错;
下面代码会报错

  1. study(name='xiaowang','office')
  1. study(name='xiaowang','office')
  2. ^
  3. SyntaxError: positional argument follows keyword argument

*args 可变长度元组参数

表示可变长度的元组类型数据,可以传参数,也可以不传参数,参数为元组类型;

  1. # *likes 可变长度的数据 ,可以传参,也可以不传参
  2. def desc(name,hometown,age,*likes):
  3. print(type(likes)) #元组
  4. print(f'我的名字是{name},来自{hometown},今年{age}岁,我的爱好:{likes}')
  5. desc('小明','上海',20)
  6. desc('小王','背景',21,'游戏','爬山')
  1. <class 'tuple'> ()
  2. 我的名字是小明,来自上海,今年20岁,我的爱好:()
  3. <class 'tuple'> ('游戏', '爬山')
  4. 我的名字是小王,来自背景,今年21岁,我的爱好:('游戏', '爬山')

**kwargs 可变长度的字典类型数据

传参数的时候 需要指定 关键字=参数值 方式传参,函数内部转化为 {key:value} 数据格式;
可以不传,也可以传多个数据;

  1. def desc(name,hometown,age,*likes,**kwargs):
  2. print(type(kwargs),kwargs)
  3. desc('小明','上海',20)
  4. desc('小明','广州',21,project='自动化测试',workyear=3)

输出结果:

  1. <class 'dict'> {}
  2. <class 'dict'> {'project': '自动化测试', 'workyear': 3}

参数的综合使用

  1. def f(name,*args,place="凡猫",**kwargs):
  2. print(name)
  3. print(place)
  4. print(args)
  5. print(kwargs)
  6. # f('xiaoming')
  7. f('xiaoming',place='home')
  8. f('xiaoming','python','api','mysql',place='Home',age=10,likes=['games','study'])

lambda 表达式

  1. def f(x):
  2. return x+1
  3. print(f(1))
  4. g = lambda x:x+1
  5. print(g(1))
  1. h = lambda x,y,z: 2*x+3*y+z
  2. print(h(1,2,3))

等价于

  1. def h(x,y,z):
  2. return 2*x+3*y+z
  3. print(h(1,2,3))

可以将函数转换为匿名函数

  1. for x in range(1, 11):
  2. print(' ' * (11 - (x + 1)) + ((2 * x) - 1) * '*')

转换为匿名函数

  1. f = lambda y: [print(' ' * (11 - (x + 1)) + ((2 * x) - 1) * '*') for x in range(y)]
  2. f(10)

总结

4.推导式 - 图1