一行Python代码能干什么?有意思!


最近看知乎上有一篇名为《一行 Python 能实现什么丧心病狂的功能?》(https://www.zhihu.com/question/37046157)的帖子,点进去发现一行Python代码可以做这么多丧心病狂的功能!

整理了一下知乎上这篇文章的内容,颇觉有趣,分享给大家。

一行代码打印乘法口诀

print('\n'.join([' '.join(["%2s x%2s = %2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))

 一行代码打印迷宫

print(''.join(__import__('random').choice('\u2571\u2572') for i in range(50*24)))

一行代码表白爱情

print('\n'.join([''.join([('Love'[(x-y) % len('Love')] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0else' ') for x in range(-30, 30)]) for y in range(30, -30, -1)]))!

一行代码打印小龟龟

print('\n'.join([''.join(['*' if abs((lambda a:lambda z,c,n:a(a,z,c,n))(lambda s,z,c,n:z if n==0 else s(s,z*z+c,c,n-1))(0,0.02*x+0.05j*y,40))<2 else ' ' for x in range(-80,20)]) for y in range(-20,20)]))

看完是不是感觉很有趣,一行Python代码可以这么搞?

人生苦短,潘石屹学Python

前两天,地产界大佬潘石屹先生先后发布微博,说自己要学Python并告知为啥要学,因为他要学Python,连他身边的朋友都教育自己的儿子要向潘叔叔学习,好好学习Python。不得不让人感叹,原来大家都在学Python。

学Python选择什么书籍?

那作为新手学习Python到底该选择什么书?有的同学会说:“看书比较枯燥,要是有视频和书籍结合在一起就好了。”

之前我给大家推荐过很多Python方面的入门书籍,《Python从小白到大牛》、《零基础入门学习Python(第2版)》,反馈都还不错,今天想为大家推荐一本书籍《Python从菜鸟到高手》,视频+书籍内容结合学习的一本书。JetBrains官方推荐图书

图书|视频|源代码|专属答疑区


扫码购买

77折优惠中...

这本书有什么值得推荐的地方?

这是一位从事20年软件开发行业、10年教育行业的李宁老师编写书籍,所以书籍的内容是老师根据学员量身定制编制的书籍,

除了作者经验比较丰富以外里面的内容很适合入门学员学习,书籍里有

  • 有一个很全的知识图谱

  • 2400分钟Python教学视频,让你学习不枯燥

  • 400道Python练习题,练习+书籍结合,让你更深刻理解知识点

  • 500个源代码案例

  • 5000页中英文电子书

  • 有专属答疑区,一对一在线答疑

  • 是最容易学的Python 3版本

书籍里视频展示

书籍里部分案例展示



扫码购买

限时优惠中...

【END】

扫码加入码书群

码书群,是一个可以为你推荐书籍的交流群,在这里,你可以和不同技术的人进行交流,不知道选择什么样的技术书籍学习,也可在群里咨询哦,学习或者工作压力比较大,也可以在群里聊些轻松的话题,也可以在群里咨询物流信息~


<think>嗯,用户这次想深入了解嵌入式系统中GPIO的控制实现方法。从对话历史看,用户之前刚询问过C语言的#define用法,现在突然转向嵌入式硬件控制,可能是正在学习嵌入式开发的综合知识。用户提供的站内引用涵盖了ARM架构、树莓派Python示例、sysfs接口、MSP430库函数、STM32固件库等多种实现方式,说明需要横向对比不同场景下的GPIO控制方案。用户身份推测:可能是电子信息类学生或刚入行的嵌入式工程师,正在做实验或项目。深层需求应该不仅是概念罗列,而是希望获得可直接落地的代码框架和选型建议。尤其关注点可能在——如何根据芯片平台选择合适的控制方式?裸机开发和操作系统环境下有何差异?技术分析维度需要展开:第一层是硬件抽象:用户引用的资料恰好展示了三种层级——最底层的寄存器直接操作(引用4的MSP430)、中间层的固件库封装(引用5的STM32)、上层的操作系统抽象(引用3的Linuxsysfs)。这部分要突出“为什么有不同方式”——性能与便捷性的权衡。第二层是编程语言差异:用户提供的Python示例(引用2)和C语言示例(引用4/5)对比很有意思。需要点明:Python控制GPIO实际是通过底层C库实现的,适合快速原型开发;工业场景仍以C为主。第三层是安全边界:所有引用代码都缺失了关键错误处理(比如GPIO初始化失败、用户权限问题等)。实际开发中这恰恰是容易踩坑的点,尤其Linux环境下需要sudo权限操作GPIO,这点必须补充。最后考虑知识延伸:用户给的STM32示例(引用5)里有时钟使能操作,这是个很好的切入点——可以自然带出“时钟门控”这个嵌入式核心概念。但不宜过度展开,保持在GPIO相关范围内。</think> 在嵌入式系统中,GPIO(通用输入输出)控制是硬件交互的核心技术,其实现方法随芯片架构和操作系统差异而不同。以下是五种典型实现方案及代码示例: --- ### 一、寄存器直接操作(裸机开发) **适用场景**:资源受限的MCU开发(如MSP430) **原理**:通过内存映射直接读写寄存器 **MSP430示例**: ```c #include <msp430.h> int main(void) { WDTCTL = WDTPW | WDTHOLD; // 关闭看门狗 P1DIR |= 0x01; // P1.0设为输出(BIT0) while(1) { P1OUT ^= 0x01; // 翻转P1.0电平 __delay_cycles(100000); // 延时 } return 0; } ``` **特点**: - 性能极致优化,时钟周期级控制 - 需查阅芯片手册获取寄存器地址[^4] --- ### 二、硬件抽象库(HAL) **适用场景**:STM32等ARM Cortex-M系列 **原理**:厂商提供的封装库统一寄存器操作 **STM32固件库示例**: ```c #include "stm32f10x.h" void LED_Init(void) { GPIO_InitTypeDef gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); gpio.GPIO_Pin = GPIO_Pin_5; // PA5 gpio.GPIO_Mode = GPIO_Mode_Out_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio); } int main() { LED_Init(); while(1) { GPIO_SetBits(GPIOA, GPIO_Pin_5); // 拉高 Delay_ms(500); GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 拉低 } } ``` **优势**:跨芯片型号移植性强[^5] --- ### 三、Linux sysfs接口 **适用场景**:嵌入式Linux系统(如树莓派) **原理**:通过文件系统操作/sys/class/gpio **操作流程**: 1. 导出GPIO:`echo 17 > /sys/class/gpio/export` 2. 设置方向:`echo out > /sys/class/gpio/gpio17/direction` 3. 控制电平:`echo 1 > /sys/class/gpio/gpio17/value` **Python封装示例**: ```python import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) # BCM编码模式 GPIO.setup(17, GPIO.OUT) # 设置GPIO17为输出 try: while True: GPIO.output(17, GPIO.HIGH) time.sleep(1) GPIO.output(17, GPIO.LOW) time.sleep(1) except KeyboardInterrupt: GPIO.cleanup() # 清理GPIO状态 ``` **注意**:需root权限操作[^2][^3] --- ### 四、芯片专用SDK **适用场景**:ESP32等物联网芯片 **ESP-IDF示例**: ```c #include <driver/gpio.h> void app_main() { gpio_config_t io_conf = { .pin_bit_mask = (1ULL << GPIO_NUM_2), .mode = GPIO_MODE_OUTPUT, }; gpio_config(&io_conf); while(1) { gpio_set_level(GPIO_NUM_2, 1); vTaskDelay(1000 / portTICK_PERIOD_MS); gpio_set_level(GPIO_NUM_2, 0); } } ``` --- ### 五、实时操作系统(RTOS)接口 **适用场景**:FreeRTOS/Zephyr等系统 **FreeRTOS + ESP32示例**: ```c #include <freertos/FreeRTOS.h> #include <driver/gpio.h> void gpio_task(void *pvParam) { gpio_pad_select_gpio(GPIO_NUM_4); gpio_set_direction(GPIO_NUM_4, GPIO_MODE_OUTPUT); while(1) { gpio_set_level(GPIO_NUM_4, !gpio_get_level(GPIO_NUM_4)); vTaskDelay(500 / portTICK_PERIOD_MS); // 非阻塞延时 } } void app_main() { xTaskCreate(gpio_task, "GPIO_Task", 2048, NULL, 5, NULL); } ``` --- ### 关键参数对比 | 实现方式 | 延迟级别 | 开发效率 | 系统依赖 | |----------------|-----------|---------|--------------| | 寄存器操作 | 纳秒级 | ★☆☆☆☆ | 无 | | 硬件抽象库 | 微秒级 | ★★★☆☆ | 无 | | Linux sysfs | 毫秒级 | ★★★★☆ | Linux内核 | | 专用SDK | 微秒级 | ★★★★☆ | 厂商SDK | | RTOS API | 微秒级 | ★★★☆☆ | RTOS环境 | > $\Delta$ 注:LED串联限流电阻计算公式: > $$R = \frac{V_{CC} - V_{LED}}{I_{LED}}$$ > 其中$V_{LED}$≈1.7V(红光),$I_{LED}$通常取5-20mA ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值