Python99 P101: Find the last element of a list 求列表中最后一个元素

求列表中最后一个元素。用单元测试描述为:

from python99.lists.p101 import find_last_one, find_last_one_recursive

def test_find_last_one():
    input = [1,4,6,'s','no','X']
    actual = find_last_one(input)
    assert actual == 'X'

Python内建的list是有序序列,其中每个元素都可以通过位置索引直接访问。且Python内建了函数len,用读取任意有序序列的长度。先用len读取list的长度,将长度减去一即为末尾元素的位置索引。

位置索引是从0开始的。

## find the last element of a list
def find_last_one(list):
    if len(list) == 0:
        return None
    return list[len(list)-1]

但用len太没逼格了,要用递归!任意列表可被拆分为第一个元素和剩余列表。剩余列表还是列表,可以继续拆分为第一个元素和剩余列表…

当剩余列表为空时,拆出来的第一个元素即原列表中最后一个元素。

def find_last_one_recursive(list):
    first = list[0]
    remain = list[1:]
    if remain == []:
        return first
    return find_last_one_recursive(remain)

单元测试:

def test_find_last_one_recursive():
    input = [1,4,6,'s','no','X']
    actual = find_last_one_recursive(input)
    assert actual == 'X'

 

设计一个基于定时器中断的1秒定时器并控制P101次流水灯的程序通常需要以下几个步骤: 1. **硬件准备**: - 确保你的微控制器有可用的定时器资源和至少P101个LED连接到适当的I/O口,作为流水灯。 2. **软件库选择**: - 如果你在使用像Arduino这样的嵌入式平台,可能会有预定义的Timer库可以使用。 3. **定时器设置**: - 初始化定时器,设置它的溢出周期为1秒。这通常涉及配置定时器的工作模式、分频系数等使其每过一秒就触发一次中断。 4. **中断服务函数**: - 编写一个ISR (Interrupt Service Routine) 函数,每当定时器溢出时会被调用。在这个函数里,你需要更新一个计数器,并控制流水灯的点亮和熄灭。例如,如果你有一个数组表示LED的状态,计数器每增加一次,就将对应的LED状态改变。 5. **循环和流水灯操作**: - 在主循环中,检查是否达到P101次的次数,如果到达则停止定时器中断,关闭流水灯,或者完成循环后再开始新的一轮。 示例代码(伪代码): ```cpp #include <Timer.h> int ledState[101]; // LED状态数组 void setup() { Timer.init(1000); // 设置定时时间为1s attachInterrupt(timer ISRFunction, true); // 触发中断 for(int i = 0; i < 101; i++) { ledState[i] = LOW; // 初始所有LED关 } } void loop() { if(currentIteration >= 101) { // 每101次结束 detachInterrupt(); // 移除中断 break; } for(int i = 0; i < 101; i++) { digitalWrite(P101 + i, ledState[i]); // 控制LED亮灭 ledState[i] = !ledState[i]; // 变换LED状态 } Timer.update(); // 更新定时器 currentIteration++; // 计数器加一 } void ISRFunction() { currentIteration++; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值