循环与布尔值

基础

        代码块以冒号开始,并且缩进相同的代码属于同一代码块。因此,if等表达式后需要跟一个冒号。

逻辑运算

        True:真。非零与非空的变量都是真。

        False:假。0、None或者空的量都是False。如

a={"dict":1}
a.clear()
if a:
        print(a)
else:
        print("else")

        如果将a.clear()不注释掉,则输出的是else,也就是说if a的判断为False。如果注释则if a:就是True。

        and:与。

        or:或。

        not:非。

if

        与别的语言中的if表达式完全一致,除了判断语句后面需要跟一个冒号外。

        elif:等同于java中else if。

for

        for xx in xxxx:——for与in关键字结合。

        结合着字典的items()方法,可以通过一个for循环将它的Key,value都取出来。如下:

>>> a={"aba":1213,"cfe":4324}
>>> for k,v in a.items():
...     print(k)
...     print(v)
... 
aba
1213
cfe
4324
        这是因为a.items()返回的是一个列表,其中的元素又都是一个元组。for循环首先取出列表中的每一个元素,而元组又可以通过k,v=()进行分解,所以for k,v in {}是可以一次性将字典的key,value值都取出来的

与else结合

        当for循环正常结束时,会执行else操作;当for循环不正常结束时,不会执行else。如:

a = {34: "value1", 12: 4234}
for k, v in a.items():
    print(k, " = ", v)
    if k == 12:
        break
else:
    print("ending")
        当没有if判断块时,会执行else语句块;但加上if判断块后,就不会执行,因为for循环不是正常结束的,是被break打断的。

与java不同的用法

        1,for循环中的变量可以直接用于生成列表,如:

L = [d for d in range(11)]
print(L) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        2,也可直接使用d进行操作。如:
L = [d**2 for d in range(11)]  # 直接求取d的平方
print(L)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

        当然,也可将d**2换成一个函数。如下:

def test(m, n):
    return (m*2)+","+n
L = [test(m, n) for m in 'xyz' for n in 'abc']  # 直接使用循环变量m,n,并将函数返回值当作列表元素
print(L)  # ['xx,a', 'xx,b', 'xx,c', 'yy,a', 'yy,b', 'yy,c', 'zz,a', 'zz,b', 'zz,c']

        3,for循环后可跟if判断,这样只有满足判断条件的变量才会被使用,如:

L = [d**2 for d in range(11) if d % 2 == 0]  # 求取偶数的平方
print(L)  # [0, 4, 16, 36, 64, 100]
        4,for循环后可直接跟for循环。如:
L = [m+","+n for m in 'xyz' for n in 'abc']  # for循环后跟另一个循环,直接使用循环中的变量
print(L)  # ['x,a', 'x,b', 'x,c', 'y,a', 'y,b', 'y,c', 'z,a', 'z,b', 'z,c']
        从上面生成的列表中可以看出一共生成了9个元素,而且它的生成效果与下面代码的效果一样:
for m in 'xyz':
    for n in 'abc':
        l.append(m+","+n)
        因此,for循环后跟for循环只是能java中for循环嵌套的简化写法。按此种写法可以写多个for循环。并且按照此思路,for后面跟的if判断也可以跟多个。如:
L = [a+b for a in range(5) for b in range(5, 8) if b % 2 == 0 if a % 2 != 0]
print(L)  # [7, 9]

        第一个if判断决定了b只能是偶数,所以b=6;第二个if判断决定了a为奇数,所以a为1,3,故返回的元素只有7和9。

        记住:for循环后跟for循环,只是对java中for循环嵌套的简写;for循环后跟if判断也是对java中for循环中嵌套if的简写




### 单片机中的布尔值使用实现 在单片机编程中,布尔值通常被用来表示逻辑状态,即真(True)或假(False)。这种二元逻辑非常适用于微控制器的应用场景,因为它们可以直接映射到底层硬件的状态,比如GPIO引脚的高电平(1)和低电平(0)。以下是关于如何在单片机中实现和使用布尔值的具体说明。 #### 数据类型的定义 大多数单片机开发环境支持C语言作为主要编程工具。在标准C语言中,并不存在内置的布尔类型,直到C99标准引入了`_Bool`关键字以及对应的宏`bool`、`true`和`false`位于头文件`<stdbool.h>`中[^3]。因此,在较新的编译器环境下,可以通过包含该头文件来直接使用布尔变量: ```c #include <stdbool.h> bool flag = false; // 定义一个布尔变量并初始化为false ``` 对于不支持C99标准的老版本编译器,则需手动定义布尔类型及其常量值: ```c typedef unsigned char bool; #define TRUE 1 #define FALSE 0 bool flag = FALSE; // 手动定义后的布尔变量声明方式 ``` #### 存储效率考虑 由于单片机资源有限,为了节省内存空间,布尔型数据一般仅占用一位(bit),但实际上很多情况下会被分配整个字节(byte)以简化操作。如果需要进一步优化存储利用率,可以利用位域(Bit Field)或者按位运算技巧来压缩多个布尔标志共存于同一个字节之中[^4]: ```c struct Flags { unsigned int isLedOn : 1; // 只占1bit unsigned int buttonPressed : 1;// 同样只占1bit } flags; flags.isLedOn = 1; // 设置isLedOn为TRUE(1) if (flags.buttonPressed == 0){ // 判断buttonPressed是否为FALSE(0) // do something... } ``` 上述结构体成员分别占据各自的一比特位置,有效减少了整体所需的内存大小。 #### 应用实例——控制LED流水灯 回到最初的讨论背景,假设我们要设计一段程序让一组LED按照特定顺序依次点亮熄灭形成流动光效。这里就可以借助布尔数组记录当前各盏灯的状态信息: ```c const uint8_t LED_COUNT = 5; bool ledStates[LED_COUNT]; void initLeds(){ for(int i=0;i<LED_COUNT;i++) ledStates[i]=false; } void updateLeds(){ static uint8_t currentIndex = 0; if(currentIndex >= LED_COUNT){ currentIndex = 0; } turnOffAll(); // 关闭所有LED ledStates[currentIndex++] = true; refreshDisplay(); } // 假设存在这样的函数去实际改变物理端口电压水平 void turnOffAll(){} void refreshDisplay(){} int main() { initLeds(); while(true){ updateLeds(); delay_ms(200); // 调整延时时间调整流速 } return 0; } ``` 此代码片段展示了如何运用布尔数组管理多颗独立工作的发光二极管的工作流程。每次循环迭代都会更新其中一个元素至开启状态(`true`),其余保持关闭(`false`)直至下一轮到来重新排列组合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值