python学习笔记2 task2

python学习笔记2 task2

1. 作业

1.编写一个Python程序来查找那些既可以被7整除又可以被5整除的数字,介于1500和2700之间。

# 1,定义一个空列表存储结果,用循环来索引1500到2700之间的数字
#2,用条件判断数字是否能被5整除,也能被7整除,能被整除的输出
#3,返回数字到列表中
def divis(m,n,s,t):
    if m>=n:
        print('参数输入错误')
    else:
        result = []
        for i in range(m,n+1):
            if i%s == 0 and i%t == 0:
                result.append(i)
        return result
res = divis(2700,2000,5,7)
print(res)
# 列表推导式
def divis(m,n,s,t):
    if m>=n:
        print('参数输入错误')
    else:
        return [i for i in range(m,n+1) if i%s == 0 and i%t == 0 ]

2,龟兔赛跑

def guitu(v1,v2,t,s,l):
    count = 0
    d = 0
    while True:
        if d < t:
            d += v1 - v2
            count += 1
        else:
            d -= v2*s
            count = count + s
        if d + count*v2 >= l and d  > 0:
            print('R 兔子赢了,\n耗时', count)
            break
        elif count*v2 >= l and d  < 0:
            print('T 乌龟赢了,\n耗时', l/v2)
            break
        elif count*v2 >= l and d == 0:
            print('D 平局,\n耗时', count)
            break

第二种稍微不一样的写法

# 最终的目的是判断兔子和乌龟谁先到终点,而这个要通过二者之间同时的路程来判断
# 1,利用时间这个变量来进行循环计算兔子和乌龟的路程差,通过路程差>=t来作为第一个条件判断兔子是否需要休息
def H_T_game(v1,v2,t,s,l):
    time = 0
    d = 0
    while True:
# 2,不休息的话,时间每次更新一秒,如果休息的话,时间更新s秒,此时距离减小s*v2,
        if d<t:
            d += v1-v2
            time += 1
        else:
            d -= v2*s
            time += s            
# 3,还要判断一次,是否此时兔子或者乌龟已经到达终点,若有则直接跳出整个循环,        
        if v2*time >= l or v2*time+d >= l:
            break
# 4 ,找出谁先到终点以及到达的时间    
    if d > 0:
        print('R, The rabbit win')
    elif d < 0:
        print('T, The tortoise win')
    else:
        print('D, a dead heat')  
    print('costTime:%d'%time)

2. 条件语句

if后面的条件可以是and、or、not,==,!=,等条件运算语句,也可以是数字,字符 串,列表等。格式及案列如下:

#if 条件1:
   #做的事情1
#elif 条件2:#可以不要
   #做的事情2
#else:#可以不要
   #做的事情3 
 num = int(input('请输入一个数字:(0-9)'))
if num>=4 and num<=7:
# if not(num>=4 and num<=7):
    print('请到办公室领奖')
 
chepiao = 1#1表述有,0表示没有
changdu = 8#刀长度,大于10不能进去
# 条件嵌套
if chepiao == 1:
    print('可以进入候车厅')
    if chengdu<=10:
        print('通过安检,等待上车')
    else:
        print('没有通过案安检')
else:
    print('请先购买车票再检票')
 
 #1.让电脑产生一个数字i
import random#随机数的库
computer = random.randint(0,2)
print('computer--->%d'%computer)
#2.提示用户并获取一个数字
player = int(input('请输入数字:0表示石头,1表示剪刀,2表示布'))
#3比较两个,若相同,则输出‘平局’,不相同,进行判断????
if (player == 0 and computer == 1) or (player == 1 and computer == 2) or (player == 2 and computer == 0):
    print('你赢了')
elif player == computer:
    print('平局')
else:
    print('你输了')

注意:1,if通过缩进来判断满足条件的执行语句,在if下面,敲一个Tab键得到缩进,缩进的内容就是满足条件时会执行的语句,如果没有缩进就不在这个条件判断内,另外,!!!if 加条件的后面一定要加一个冒号:,python的条件,循环,定义函数、类,with方法等都需要在末尾加上冒号,这样才会判断语句,不加就报错了,加了冒号后,直接按回车键就可缩进了。
2,python 中同一个缩进级别的语句运行顺序是平行的,因此,if和elif以及else在一个循环结构中一定要对齐。

assert这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssertionError的异常
#在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作

3. 四个循环结构

3.1 while 循环

while与for的区别在于,while是按条件循环,条件满足时就会一直循环,也就是布尔表达式的值为布尔假时跳出循环,布尔值的真假见上个学习内容task1。没有固定的次数,不确定循环多少次的话,可以用while Ture,条件只要是永远为真的都可;而for是按找迭代对象的大小来循环,结构一定是for xxx in xxx,后面的迭代对象可以是字符串,列表,字典,元组等。

例子:

i= 1
res = 0
while i<=100:
    if i%2 == 0:
#        print(i) 
        res += i
    i += 1    
print('1-100的偶数的和为:%d'%res)
# 1-100的偶数的和为:2550

while循环也可用嵌套,例子:

#while循环的嵌套
#每行输出对应行数的*
i= 1
#控制行数
while i<=5:
#    print('*'*i)#法1
#方法2
    #控制一行中*的个数
    j = 1
    while j<=i:
        print('* ',end = '')#加end=空一行继续输出的意思
        j += 1
    print('')#此处目的为换行
    i += 1
 '''
* 
* * 
* * * 
* * * * 
* * * * * 
'''

3.2 while - else 循环

while 布尔表达式:
    代码块
else:
    代码块

当while循环正常执行完的情况下,执行else输出,如果while循环中执行了跳出整个循环的语句,比如 break,将不执行else代码块的内容。

count = 0
while count < 5:
    print("%d is  less than 5" % count)
    count = count + 1
else:
    print("%d is not less than 5" % count)  
# 0 is  less than 5
# 1 is  less than 5
# 2 is  less than 5
# 3 is  less than 5
# 4 is  less than 5
# 5 is not less than 5
# 加了break 后
count = 0
while count < 5:
    print("%d is  less than 5" % count)
    count = 6
    break
else:
    print("%d is not less than 5" % count)

# 0 is  less than 5

3.3 for 循环

for循环跟逻辑结构跟while是类似,但是for是一个迭代循环,有循环次数限制,for可以遍历任何有序序列,for是按找迭代对象的大小来循环,结构一定是for xxx in xxx,后面的迭代对象可以是字符串,列表,字典,元组等,还可以是range迭代器。
for后迭代对象如果是字典的话有三种循环对象:
1,选取的是键值对这一整个对象,key表示键,value表示值,注意要in对象.items(),这两个成对出现

dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

for key, value in dic.items():
    print(key, value, sep=':', end=' ')
    
# a:1 b:2 c:3 d:4 

2,只选取键,要in对象.keys(),

dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

for key in dic.keys():
    print(key, end=' ')
    
# a b c d 

3,只选取值,要in对象.values(),

dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

for value in dic.values():
    print(value, end=' ')
    
# 1 2 3 4

3.4 for - else 循环

与while - else语句一样,当for循环正常执行完的情况下,执行else输出,如果for循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容。

for num in range(10, 20):  # 迭代 10 到 20 之间的数字
    for i in range(2, num):  # 根据因子迭代
        if num % i == 0:  # 确定第一个因子
            j = num / i  # 计算第二个因子
            print('%d 等于 %d * %d' % (num, i, j))
            break  # 跳出当前循环
    else:  # 循环的 else 部分
        print(num, '是一个质数')

# 10 等于 2 * 5
# 11 是一个质数
# 12 等于 2 * 6
# 13 是一个质数
# 14 等于 2 * 7
# 15 等于 3 * 5
# 16 等于 2 * 8
# 17 是一个质数
# 18 等于 2 * 9
# 19 是一个质数

4. 三个跳出语句

4.1 break语句

break是跳出当前整个循环,这个循环层在break后面的内容都不执行了,下面这个例子很好的说明了:

import random
secret = random.randint(1, 10) #[1,10]之间的随机数

while True:
    temp = input("不妨猜一下小哥哥现在心里想的是那个数字:")
    guess = int(temp)
    if guess > secret:
        print("大了,大了")
    else:
        if guess == secret:
            print("你这样懂小哥哥的心思啊?")
            print("哼,猜对也没有奖励!")
            break
        else:
            print("小了,小了")
print("游戏结束,不玩儿啦!")
#不妨猜一下小哥哥现在心里想的是那个数字:10
#大了,大了
#不妨猜一下小哥哥现在心里想的是那个数字:1
#你这样懂小哥哥的心思啊?
#哼,猜对也没有奖励!
#游戏结束,不玩儿啦!

要注意的是,这里break 虽然是在if 条件语句中,但它跳出的是整个while循环

4.2 continue语句:

与break有点像的是continue**,这里也先介绍continue语句,continue跳出的是本轮循环并开始下一轮循环

for i in range(10):
    if i % 2 != 0:
        print(i)
        continue
    i += 2
    print(i)
# 2
# 1
# 4
# 3
# 6
# 5
# 8
# 7
# 10
# 9

解释一下上面的代码,首先i=0,不满足if,到i=i+2=2,输出,然后继续循环,注意下一个循环i是在range(10)中取的,所以i=1,进入条件语句,输出1,然后跳出当层循环,也就是i=1这个循环,继续i=2循环,以次类推。

4.3 pass语句

此外还有个pass语句,pass 语句的意思是“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而 pass 语句就是用来解决这些问题的。pass是空语句,不做任何操作,只起到占位的作用,其作用是为了保持程序结构的完整性。尽管pass语句不做任何操作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个pass语句,让代码可以正常运行。

5. 两个迭代对象函数(迭代器)

5.1 range() 函数

range的形式是range([start,] stop[, step=1]),其中中括号里的内容可要可不要。这三个参数意思为:start值指的是迭代对象初始值, stop指是迭代对象末尾值+1,也就是只能取到stop-1,step表示start取到stop-1的步长。不输入start,默认其值为0,不输入step 的话默认其值为1。

for i in range(1, 10, 2):
    print(i)

# 1
# 3
# 5
# 7
# 9

5.2 enumerate()函数

enumerate()函数的形式为enumerate(sequence, [start=0]),这个sequence内容可以是一个序列、迭代器或其他支持迭代对象,如列表,字典,元组等,这个会对应两个值,一个是迭代的序号,一个是sequence中的内容,而start是序号开始位置。不输入start,默认其值为0

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
lst = list(enumerate(seasons))
print(lst)
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
lst = list(enumerate(seasons, start=1))  # 下标从 1 开始
print(lst)
# [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

enumerate()与 for 循环的结合使用,形式为

for i, a in enumerate(A)
    do something with a  

用 enumerate(A) 不仅返回了 A 中的元素,还顺便给该元素一个索引值i (默认从 0 开始)。此外,用 enumerate(A, j) 还可以确定索引起始值为 j。

languages = ['Python', 'R', 'Matlab', 'C++']
for language in languages:
    print('I love', language)
print('Done!')

'''
I love Python
I love R
I love Matlab
I love C++
Done!
'''

for i, language in enumerate(languages, 2):
    print(i, 'I love', language)
print('Done!')

'''
2 I love Python
3 I love R
4 I love Matlab
5 I love C++
Done!
'''

6. 几个循环推导式

循环推导式的目的在于简洁代码,直接在定义中迭代该对象的取值范围。

6.1 列表推导式

即得到的迭代对象为列表,列表的形式为a[],类似matllab中的元包,列表中的元素可以是,数组、元组、字典、列表,格式为
[ expr for value in collection [if condition] ],这个if 是在for循环中的条件判断。即一个表达式或者数据+for +循环变化变量(i等)+in+变化范围(+if或者其他循环),for 后面的内容都是在第一个for 这个循环层的。

x = [-4, -2, 0, 2, 4]
y = [a * 2 for a in x]
print(y)
# [-8, -4, 0, 4, 8]
x = [i ** 2 for i in range(1, 10)]
print(x)
# [1, 4, 9, 16, 25, 36, 49, 64, 81]

列表内容为元组,结果的索引形式为x[3][2] =0

x = [(i, i ** 2) for i in range(6)]
print(x)
# [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]
print(x)
# [3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99]

下面这个程序有两个循环,应该是嵌套循环,先取i=0,再j的值取满

a = [(i, j) for i in range(0, 3) for j in range(0, 3)]
print(a)
# [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
x = [[i, j] for i in range(0, 3) for j in range(0, 3)]
print(x)
# [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]

x[0][0] = 10##改变第一个列表内容的第一个值
print(x)
# [[10, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]

下面这个例子说明了推导式中有多个for和if的层级关系,后面的都在前面的嵌套中。

a = [(i, j) for i in range(0, 3) if i < 1 for j in range(0, 3) if j > 1]
print(a)

# [(0, 2)]

6.2 元组推导式

表达式与列表的一致

a = (x for x in range(10))
print(a)
# <generator object <genexpr> at 0x0000025BE511CC48>,为a存储的地址,a为迭代器,输出不出来
print(tuple(a))
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

6.3 字典推导式

格式为:
{ key_expr: value_expr for value in collection [if condition] }
字典的键值对要成对赋值出现,

b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)
# {0: True, 3: False, 6: True, 9: False}

这里的值是布尔形式,也就是i 是否整除2这一判断值

6.4 集合推导式

集合推导式结果是去重

c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}
print(c)
# {1, 2, 3, 4, 5, 6}

有一个综合例子,很好的表述了上述内容结合的运用
这个代码的目的是:用户有输入三次密码的机会,输入对了直接跳出程序,输入错了则继续输入,但是只剩两次机会了,直到三次机会用完。

passwdList = ['123', '345', '890']
valid = False
count = 3
while count > 0:
    password = input('enter password:')
    for item in passwdList:
        if password == item:
            valid = True
            break
            
    if not valid:
        print('invalid input')
        count -= 1
        continue
    else:
        break
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值