python小咖 for循环及 enumerate() 使用

本文介绍了Python中的for循环及其与range()函数的使用,详细解析了range()的语法和注意事项,包括其不可变性和可迭代特性。示例展示了如何用for循环解决百钱买百鸡问题,并探讨了在不同场景下选择while或for循环的考量。同时,文章提到了列表操作中的常见错误以及如何在一行中打印多个元素,并讨论了反向迭代器reversed()的使用。最后,提供了一段代码实现两个字典的合并与值相加。
利用for循环 遍历列表a

a=[1,2,3,4,5]
for i in a[::-1]: #-1表示从右往左
	print(i)
	i+=1  #这句多余
5
4
3
2
1


a=['a','b','c','d','e']
for member in a:
	print(member)
a
b
c
d
e


a=['a','c','d','ok']
for i in a[::-1]:
	print(i)

ok
d
c
a

enumerate多用于在for循环中得到计数
a=['a','c','d','ok']
for index,item in enumerate(a):
	print(index,item)   #index,索引号;item列表中的元素项如a,c ,d

0 a
1 c
2 d
3 ok

注:可以指定索引号起始数.
a=['a','c','d','ok']
for index,item in enumerate(a,1):  #指定索引起始值为1而不是通常默认的0
	print(index,item) 

1 a
2 c
3 d
4 ok
补充: (更多参考https://blog.csdn.net/churximi/article/details/51648388)
如果要统计文件的行数,可以这样写:

count = len(open(filepath, 'r').readlines())
1
这种方法简单,但是可能比较慢,当文件比较大时甚至不能工作。

可以利用enumerate():

count = 0
for index, line in enumerate(open(filepath,'r')): 
    count += 1


x = list(range(20))
for index, value in enumerate(x):
    if value == 3:   #当循环到value=3时,index也是其对应的索引号3,
    x[index] = 5     #所以x[3]=5,即是把值3改为5.






a=list(range(10))
print(a[len(a)-1-i]) #从列表的后面朝前逐个输出
print(a.pop()) #与上句输出功能相同,其实不同,上一句受i的变化影响,如果涉及改变列表长度的时候
	#                 则上一句大多执行不完整就会因下标对应的元素,与实际位置不一样,而提示出错不能运行.

for i in range(10):

range()的用法:

语法:range(start, stop [,step]) ;start 指的是计数起始值,默认是 0;stop 指的是计数结束值,但不包括 stop ;step 是步长,默认为 1,不可以为 0 。range() 方法生成一段左闭右开的整数范围。


 
  1. >>> a = range(5)  # 即 range(0,5)

  2. >>> a

  3. range(0, 5)

  4. >>> len(a)

  5. 5

  6. >>> for x in a:

  7. >>>     print(x,end=" ")

  8. 0 1 2 3 4

对于 range() 函数,有几个注意点:(1)它表示的是左闭右开区间;(2)它接收的参数必须是整数,可以是负数,但不能是浮点数等其它类型;(3)它是不可变的序列类型,可以进行判断元素、查找元素、切片等操作,但不能修改元素;(4)它是可迭代对象,却不是迭代器。

  1. # (3)序列操作

  2. >>> b = range(1,10)

  3. >>> b[0]

  4. 1

  5. >>> b[:-3]  #和列表类似,方括号内的位号,-3表示从右往左第3个数。因为range(1,10)最右边的数为9,所以-3位为7。

  6. range(1, 7)

  7. >>> b[0] = 2  #会显示错误,因为与字符串一样,属不可改原值

  8. TypeError  Traceback (most recent call last)

  9. ...

  10. TypeError: 'range' object does not support item assignment

range(起始数,结束数,间隔),在结束数之前的一位为止,不包括结束数位置.

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

0
2
4
6
8
尝试编写程序,生成包含20个随机数的列表,然后 将前十个元素升序排列,后十个元素降序排列,并输出结果

import random
x = [random.randint(0,100) for i in range(20)] #从0到时100(包含0和100)生成20个随机数,
print(x)
y = x[0:10]
y.sort()

x[0:10]=y  #这一句升序后的10个数赋与列表前10位.
y = x[10:20]
y.sort(reverse = True)  #降序
x[10:20] = y        #降序后的数给后10位
print(x)
(参考:https://blog.csdn.net/anyifan369/article/details/84963379)

关于随机数random
在Python中,通过import random,然后调用random.randomint(a,b)得到的数为(a<=x<=b),

import random
for i in range(20):
   print(random.randint(0,1))
# 输出    
1

在numpy中的random模块中,调用random.randint(a,b)得到的是 ( a<= x < b)

from numpy import random
 for i in range(20):
    print random.randint(0,1)   
#输出
0
0

使用循环求解百钱买百鸡问题。假设大鸡5元一只,中鸡3元一只,小鸡1元三只,现有100元钱想买100只鸡,有多少种买法?
分析
:
先考虑一下用while还是用for循环,深入思考一下看看,循环次数能否确定,
 设大鸡x只,中鸡y只,小鸡z只

则有:
 x+y+z=100  #100只  鸡数100
 5*x+3*y+z*1//3=100  #100元  钱数100
x,y,z ∈  N  鸡数x,y,z都是自然数,不有为负数,这也是一个条件.  


 取其中的一种鸡,大鸡,X有几种可能,也就是推出可能的循环取值次数,最多有100//5=20.
 遍历range(21)计数应该取21,表示0至20; 中鸡的取值最多只能100//3=33 取33,range(34)
//表示整除  返回不大于结果的一个最大的整数  /专用于表示浮点计算.结果带有小数点.

for x in range(21):
    for y in range(34):
        z=100-x-y
        if z%3 ==0:
            if 5*x + 3*y +z//3==100:
                print(x,y,z)

0 25 75
4 18 78
8 11 81
12 4 84
[Finished in 0.1s]

 

在用print输出的时候,如果想在同一行输出 ,则可参考如下方式:print (i,end='')

for i in reversed([2, 3, 4, 5]):
    print(i, end = ',')   #引号中的,表示要用,分隔开各元素.

5,4,3,2,

如果不用,隔开,print(i, end = '')则输出为:

5432

关于reversed(seq),反向迭代,并且只能消费一次,之后变为空.

 

列表常见错误大多数是错在标点符号(引号、括号、逗号等),特别是逗号用成了全角的。搜狗输入法可以通过ctrl+.来变换为半角符号状态()。

微软win10带的五笔没有发现这个功能。虽然可以用左shift键实现中文输入法关闭,但常因频繁切换shift键带来误差,所以换掉。

写一段代码,实现两个字典的相加,不同的key对应的值保留,相同的key对应的值相加后保留。

dicta = {"a":1,"b":2,"c":3,"d":4,"f":"hello"}

dictb = {"b":3,"d":5,"e":7,"m":9,"k":"world"}

如上示例得到结果为:

dictc = {"a":1,"b":5,"c":3,"d":9,"e":7,"m":9,"f":"hello","k":"world"}

dicta = {"a":1,"b":2,"c":3,"d":4,"f":"hello"}
dictb = {"b":3,"d":5,"e":7,"m":9,"k":"world"}
dictc={}
for key in dicta:
	if dictb.get(key):
		dictc[key]=dicta[key]+dictb[key]
	else:
		dictc[key]=dicta[key]

for key in dictb:
	if dicta.get(key):
		pass
	else:
		dictc[key]=dictb[key]
print(dictc)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值