当前位置: 首页 > 编程日记 > 正文

给老婆写个Python教程

640?wx_fmt=jpeg

作者 | 水风

来源 | 水风知乎问答

如何挑战百万年薪的人工智能!

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

什么是code

code就是一种语言,一种计算机能读懂的语言。计算机是一个傻逼,他理解不了默认两可的任何东西。比如,你让你老公去买个西瓜,你老公会自己决定去哪里买,买几个,找个搞活动打折的买,总之,你给他钱,他就给你买回来让你吃到爽的西瓜。但是,你想让计算机买一个西瓜?你要告诉他:去门口的鲜丰水果店买,买沙瓤无子西瓜,若旁边的店打折,就去旁边的店买。总之,你不能让计算机做任何决定,你要清楚的告诉他所有情况下的所有的行为。而code,就是你和计算机交流的语言,或者说是对计算机的命令。

我们就把计算机理解为一个人,这个人很死板,只能按照你给他的详细命令进行工作。而这个人工作速度特别特别快,并且保证工作结果都是正确的。

编程语言其实不重要,重要的是要明白如何和计算机交流,明白了这个也就能看懂代码了。

python就是一种和计算机交流的语言,这种语言单词(关键字)不多,规则也少。下面所有的内容都基于python。

判断

当你命令计算机做一件事情的时候,这件事情可能分一些情况进行处理。

判断通常涉及到的关键字有:if , else, elseif, and, or,<, >,=,<=,>=,==

比如,你让计算机买西瓜,希望买到打折的西瓜,不打折的话你就不吃了。

if  水果店打折:
    买西瓜
else:
    不买了

通过这个命令,计算机变得更智能了一些,他可以根据情况执行你的命令。

水果店不打折你就吃不到西瓜,你不开心。那么,我们让计算机更智能一些。假如西瓜打折,就买西瓜;不打折的话让计算机跟老板讲价,老板同意打折,就买西瓜;不同意,不吃了;

if  水果店打折:
    买西瓜
else:
    与老板讲价
    if 讲价成功:
        买西瓜
    else:
        不吃了。

虽然和老板讲价一般都能讲成功,但是有的老板给力给打五折,有的老板只给打九折。你就想了,若老板打五折,我就买两个,今天吃一个,明天吃一个。若老板不给力,打折不到五折,就买一个,今天先吃,明天再说。

if  水果店打折:
    买西瓜
else:
    与老板讲价
    if 打折成功 and 打折力度<=5
        买两个西瓜
    elseif 打折成功 and 打折力度 > 5
        买一个西瓜
    else:
        不吃了。

此外,有没有发现,打着成功这段代码其实也可以写成:

if 打折成功:
        if 打折力度<=5:
            买两个西瓜
        else:
            买一个西瓜
    else:
        不吃了。

由此可见,计算机也不是完全的一成不变,只要你给他的命令他能理解并且不会默认两可,他都可以完成工作。

and的意思代表且,or的意思代表或。and和or的顺序不同,结果也不同,可以通过括号来说明判断条件的优先级。

a==b是比较a和b是否相等的意思,而=代表赋值。赋值的含义,我在下面的变量章节介绍。

循环

python中涉及到循环的关键字包括:for...in... ,while,break,continue

上面的例子我们已经让电脑成功的可以根据不同的情况去水果店买西瓜了,但是若老板不打折,你就吃不到西瓜了。这时,你就想了,咱们小区门口有三家水果店,分别是鲜丰水果、四季水果和路边摊,一家不打折不代表三家都不打折啊,所以你希望电脑可以去三家都去看看,挑一家打折的店买西瓜。

for 水果店 in (鲜丰水果、四季水果和路边摊):
    if 水果店 打折:
        买西瓜
        break(循环结束)
    else:
        啥都不做
带西瓜回家

循环的意义在于,可以用电脑对不同的对象执行相同的命令。

介绍下break,break的意思就是结束循环。比如,这段代码中的break表示,我们一旦买了西瓜,那么就带西瓜回家。

变量

现在是时候介绍'变量'这个重要的东西了。

我们依然把电脑理解为帮我们工作的一个人,那么作为一个人,他需要有记忆力,而我们就可以通过变量去控制、利用计算机的记忆力。

变量可以理解为计算机的一个记忆单元,计算机拥有极好的记忆力,所以,可以随心所欲的使用,用完了就扔,需要了就要。(当然,说随心所欲是不严谨的,但是你可以理解为随心所欲)

那为什么叫变量呢,就是因为可以改变。为什么要改变呢?比如我们都有自己的年龄,我今年18,明年就19了。所以,'年龄'在我的记忆里是每年改变的。

变量对应的一个东西叫常量,在我的记忆力,我的老婆是江江同学。而这个'老婆'这个记忆单元在我的脑子里是不会变的,她永远都是江江同学。常量你现在可以不用理解,我写主要是为了秀恩爱。

现在,计算机又要去买西瓜了。不过这次,你希望计算机可以在三个水果店中,找到一个打折力度最大的水果店去买水果。

之前所有水果店的最大折扣 = None
之前给最大折扣的水果店 = None
for 水果店 in (鲜丰水果、四季水果和路边摊):
    当前水果店折扣 = 老板给的折扣
    if 当前水果店折扣 < 之前所有水果店的最大折扣:#4折比5折力度大
        之前所有水果店的最大折扣 = 当前水果店折扣
        之前给最大折扣的水果店 = 水果店

去 之前给最大折扣的水果店 买一个西瓜

以上有以下几个记忆单元:

  • 之前所有水果店的最大折扣

  • 之前给最大折扣的水果店

  • 当前水果店折扣

  • 水果店 注意,for a in b,a也是一个变量,他在每次执行的时候都是b中的当前执行的一个元素。

这里需要介绍一些概念:

  • None 在python中表示空,表示这个记忆单元现在啥都没有。比如在我情窦初开时,脑海中就已经有了情人这个记忆单元,我一直在寻找,但遇到你之前一直没有找到,所以那段时间这个记忆单元里面一直是空。

  • 赋值符号:=。 注意,在计算机语言里面,一个'='号表示赋值,两个等号'=='表示比较前后元素。赋值的意思是,把后面的元素,放到前面的变量里面。

变量的作用域

作用域这个东西非常重要,但是真心不想讲,因为没办法结合现实的例子,不过还是大体说明下。

还是刚才的例子,我加了行号,并且我使用-代表空格,表示代码的缩进。

1 之前所有水果店的最大折扣 = None
2 之前给最大折扣的水果店 = None
3 for 水果店 in (鲜丰水果、四季水果和路边摊):
4 ---当前水果店折扣 = 老板给的折扣
5 ---if 当前水果店折扣 < 之前所有水果店的最大折扣:#4折比5折力度大
6 ------之前所有水果店的最大折扣 = 当前水果店折扣
7 ---之前给最大折扣的水果店 = 水果店
8 去 之前给最大折扣的水果店 买一个西瓜

你看这个例子可能纳闷,为什么要先给'之前所有水果店的最大折扣'、'之前给最大折扣的水果店'这两个变量赋值为None呢。就是因为作用域问题。

你看这个程序,每行代码的缩进都是不一样的。变量作用域可以理解为:一个变量,只有在其第一次出现的地方的缩进,以及缩进更多的代码里面,才有效。我们第1、2行的变量,就可以用于3-8行,因为这些代码的缩进都在1、2行的后面。而第四行的变量'当前水果店折扣',只在5、6、7行有效

1  A = None
2  ————B = None
3  ————..
4  ————————C = None
5  ————————..
6  ————D = None
7  ————..
8  ————————..
9  ————————..
10 ..
11 ..

再举个例子,ABCD是变量,..代表某些代码。A的作用域就是1-11行,即1-11行都可以使用A。B的作用域是2-9行,C的作用域只有4-5行,注意,8-9行就不能再使用C了,虽然他的缩进和4、5行一样,作用域遇到第一个不能用缩进行代码即结束。D的作用域就是6-9行。

函数和模块

看懂以上几节,大概应该明白计算机如何执行代码的了。

而函数和模块,和之前的介绍不太一样。之前是介绍如何让计算机工作,是面向计算机的。而这一节,是面向人的,是如何让我们写给计算机的代码看起来更加简洁、明了。函数和模块都是对代码结构的优化,否则一个稍微大点的项目,一大坨代码,计算机看得懂人看不懂,不利于管理和交流。

首先说函数。函数是一系列代码的集合,用函数一般是有几个原因:

1.给一段代码起个名字。

2.这段代码和使用它的代码关系不大,所以可以抽出来,抽出来后代码更简洁。关系不大的意思就是:使用函数的代码通过传给函数几个参数,函数就可以执行。

3.代码集合起来就可以在代码的不同地方使用。

依然我们去买西瓜,不过我们希望电脑可以今天买完西瓜明天再买一个。按照之前的方式,这个逻辑应该写成这样:

for 水果店 in (鲜丰水果、四季水果和路边摊):
    if  水果店打折:
        买西瓜
    else:
        与老板讲价
        if 打折成功 and 打折力度<=5
            买两个西瓜
        elseif 打折成功 and 打折力度 > 5
            买一个西瓜
        else:
            不吃了。

休息一天。

for 水果店 in (鲜丰水果、四季水果和路边摊):
    if  水果店打折:
        买西瓜
    else:
        与老板讲价
        if 打折成功 and 打折力度<=5
            买两个西瓜
        elseif 打折成功 and 打折力度 > 5
            买一个西瓜
        else:
            不吃了。

上面的代码可以实现我们的要求,但是买西瓜的代码其实是重复的,对于重复代码,管理起来比较麻烦,比如你想改一点,那么就要去各个地方都改一次。

那么,我们把买西瓜的代码弄成一个函数,代码就可以整理为:

def 买西瓜_函数():
    for 水果店 in (鲜丰水果、四季水果和路边摊):
        if  水果店打折:
            买西瓜
        else:
            与老板讲价
            if 打折成功 and 打折力度<=5
                买两个西瓜
            elseif 打折成功 and 打折力度 > 5
                买一个西瓜
            else:
                不吃了。

买西瓜_函数()
休息一天。
买西瓜_函数()

这一次,代码整洁多了,而且,我们每次想修改买西瓜的代码,都只需要改这个函数一处代码都可以。

在python中,使用def function_name():定义函数,函数下面所有的缩进都属于这个函数,叫函数体。

使用function_name()调用函数。

函数参数

现在你又不满足与电脑只会买西瓜了,你又想吃柚子。怎么办呢,那么是不是我们又要写一个买柚子的函数呢。

当然可以再写一个买柚子函数,但是买柚子函数的逻辑和买西瓜函数的逻辑都是一样的,命令也一样,唯一的区别就是之前是卖西瓜,现在是买柚子。如果再写一个类似的买柚子函数,那么又出现刚才说的问题,每次修改买水果的逻辑,都需要同时去修改买西瓜、买柚子函数,如果柚子吃腻了,又要买香蕉、苹果、梨,岂不是要写非常多的函数?

为了解决这个问题,其实有一个更好的方法,就是使用函数参数。

由于我们买水果(无论是西瓜、还是柚子)的功能都是一样的,所以我们可以写一个买水果函数,买水果函数定义了买一个水果的流程,当我们使用这个函数的时候,我们只要告诉这个函数我们要买什么水果,函数就可以根据你告诉他的水果名,去买对应的水果。

买水果函数的代码如下:

def 买水果函数(水果名):
    for 水果店 in (鲜丰水果、四季水果和路边摊):
        if  水果店打折:
            买[水果名]
        else:
            与老板讲价
            if 打折成功 and 打折力度<=5
                买两个[水果名]
            elseif 打折成功 and 打折力度 > 5
                买一个[水果名]
            else:
                不吃了。


买水果函数(西瓜)#让电脑去买西瓜
买水果函数(柚子)#让电脑去买柚子

在python中想使用函数参数,只需要在函数定义的时候,在括号里面加上参数即可,我们这里的参数就是'水果名'。在函数体中代码可以使用函数参数。

在调用函数的时候,把一个变量或者常量写在函数名后面的括号里面,传给函数。

注意,若是存在多个参数,函数定义和调用函数的参数顺序一定要一致。

在python中,还存在默认参数、关键字参数等稍微高级一点的使用方式,举个例子,不详细说明了。

def sum(a, b = 0,c = 1):#b/c是默认参数
   return a+b+c

func(1,0,1)
func(1)
func(1,c=1)

这三个func调用的结果都是一样的。

未完待续....

原文地址:

https://www.zhihu.com/question/60766946/answer/183072131

(本文为 AI大本营转载文章,转载请联系原作者)

人工智能的现状及今后发展趋势如何? 

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

群招募

扫码添加小助手微信,回复:公司+研究方向(学校+研究方向),邀你加入技术交流群。技术群审核较严,敬请谅解。

640?wx_fmt=jpeg

推荐阅读:

  • 2018 Python开发者大调查:Python和JavaScript最配?

  • 拿下中科大的计算机课程全靠它了!

  • 访问量最高超7百万的Stack Overflow问题竟然是...

  • 给老婆写的Python教程

  • “软件外包城”下的马鞍山 | 程序员有话说

  • 神操作!程序员如何拿下硅谷顶级公司 200 万年薪?!

  • 可怕!9岁男孩为买任天堂游戏机,竟然...

  • 云评测 | OpenStack智能运维解决方案 @文末有福利!

  • 月入5万,程序员夫人们过上"贵妇"生活了吗?

640?wx_fmt=png

点击“阅读原文”,查看历史精彩文章。

相关文章:

SpringBoot的修改操作

今天学习SpringBoot 的 CRUD 操作&#xff0c;练习 修改操作 时&#xff0c;发生了如下的异常&#xff1a; [nio-8080-exec-7] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.dao.InvalidDataAccessApiUsa…

【Qt】QImage、QPixmap、QBitmap和QPicture

简述 Qt 提供了四个用于处理图像数据的类: QImage、 QPixmap、 QBitmap和QPicture。QImage是为 I/O 设计和优化的, 用于直接像素访问和操作, 而QPixmap是为在屏幕上显示图像而设计和优化的。QBitmap继承自QPixmap&#xff0c;用在位深为1&#xff08;黑白图片&#xff09;上。…

ASP.NET,IIS7.0 上传大视频文件报错

一、问题概述&#xff1a; 最近开发上传视频文件的功能。基本流程已经跑通了&#xff0c;可是上传30M以上的文件时就会报错。 二、资料海洋瞎扑腾 从网上查了一些资料&#xff0c;一般都是下面这种说法&#xff1a; 看着步骤倒是也不算繁琐&#xff0c;可是本人照着步骤做了却没…

【imx6】Unable to find the ncurses libraries的解决办法

问题描述 在执行make menuconfig时&#xff0c;报错&#xff1a; Unable to find the ncurses libraries… 解决方法 安装ncurses和ncursesw库 sudo apt-get insatll ncurses-dev sudo apt-get insatll ncursesw-dev 注意&#xff1a;ncursesw库是ncurses的升级版本&#…

Elasticsearch6.1.3 for CRUD

为什么80%的码农都做不了架构师&#xff1f;>>> 一、创建文档 [root AOS2 AutoTest01:/root]#curl -X PUT 9.1.6.140:9200/students/class1/1?pretty -d > { > "first_name": "changwei", > "last_name": "…

指纹锁就安全了?防火防盗还得防AI

整理 | 一一 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 如何挑战百万年薪的人工智能 https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 近日&#xff0c;你应该看到了社交媒体上对于网站 ThisPersonDoesNotExist.com&#xff0c;生成无数不存在人脸的铺天…

迪杰斯特拉算法(C语言实现)

迪杰斯特拉算法&#xff08;C语言实现&#xff09; 如上图&#xff0c;求以a为源点到个顶点的最短路劲。 #include "stdio.h"#include "stdlib.h"//用一个最大数表示顶点之间不相关#define MAX 999//设置顶点个数#define MAX_VERTEX_NUM 7//表示顶点之间不…

小米半年来最大调整:成立技术委员会,雷军称技术事关生死存亡

整理 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;昨晚&#xff0c;小米集团组织部下发正式文件&#xff0c;宣布了最新一轮组织架构调整&#xff0c;任命了崔宝秋为集团副总裁&#xff0c;集团技术委员会主席&#xff0c;并且在核心管理岗位上共任命了 14 …

【驱动】在内核源码中添加驱动程序

以wifi驱动(RTL8188EUS驱动)为例 添加源码 将源码rtl8188EUS添加到drivers/net/wireless/rtl818x/目录下 添加Kconfig 在drivers/net/wireless/rtl818x/rtl8188EUS添加Kconfig&#xff0c;内容如下&#xff1a; config RTL8188EUtristate "Realtek 8188E USB WiFi&qu…

怎么让wordpress用sqlite3 搭建轻量级博客系统

wordpress 默认是用mysql作为数据库支持&#xff0c;这个对个人站长来说还是有点麻烦了些。特别是如果以后网站备份迁移就有点事多了。 之前用django开发自己的博客感觉其实用sqlite3作为数据库插好&#xff0c;就是一个文件而已。备份网站&#xff0c;直接打包整个目录即可方便…

IBM蓝色基因/Q将采用NAND闪存存储

IBM将在计划中的高性能“怪兽”——蓝色基因/Q中采用NAND闪存存储。 这是一款采用水冷方式的高性能计算系统&#xff0c;IBM在近日的SC10大会上展示了其原型机的组件。 蓝色基因/Q将采用的闪存是来自SMART的XceedIOPS MLC NAND产品&#xff0c;它使用34nm制程工艺&…

全球超2万名开发者调研:Python 3渗透率至84%

编辑 | suiling 出品 | Python大本营&#xff08;ID&#xff1a;pythonnews&#xff09; 60s测试&#xff1a;你是否适合转型人工智能&#xff1f; https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 在2018年秋季&#xff0c;Python软件基金会与JetBrains发起了年度Python…

【Qt】QWidget对样式表设置边框无效的解决方法

1、现象 在对QWidget使用样式表时无效 QWidget#MyWgt{border:1px solid gray; }2、原因 原因是QWidget只支持background、background-clip和background-origin属性。 3、解决方法 3.1 使用QFrame代替QWidget&#xff0c;QFrame继承自QWidget&#xff0c;并且带有框架属性 …

break continue

break 终止整个循环体&#xff0c;执行循环后的代码&#xff1b; continue 终止单次的循环&#xff0c;整个循环体还是会继续执行转载于:https://www.cnblogs.com/RonnieQin/p/8430783.html

CSSA email list

UCSD: cssamailman.ucsd.eduUChicago: cssalists.uchicago.edu 转载于:https://www.cnblogs.com/stoneresearch/archive/2010/11/30/4336484.html

LVS原理详解(3种工作方式8种调度算法)--老男孩

一、LVS原理详解&#xff08;4种工作方式8种调度算法&#xff09;集群简介集群就是一组独立的计算机&#xff0c;协同工作&#xff0c;对外提供服务。对客户端来说像是一台服务器提供服务。LVS在企业架构中的位置&#xff1a;以上的架构只是众多企业里面的一种而已。绿色的线就…

【Qt】QMainWindow最大化按钮是灰色(不能最大化)的解决方法

解决方法 设置最大尺寸为16777215&#xff0c;并且使能Qt::WindowMaximizeButtonHint&#xff08;默认就是使能的&#xff0c;不执行也可以&#xff09; const QSize MAIN_SIZE_MAX QSize(16777215, 16777215); this->setMaximumSize(MAIN_SIZE_MAX); this->setWindow…

“AI明星”地平线B轮融资6亿美元!

整理 | 一一 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 60s测试&#xff1a;你是否适合转型人工智能&#xff1f; https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 2 月 27 日&#xff0c;人工智能芯片技术的 AI 创业企业地平线(Horizon Robotics)宣布&a…

C++深拷贝与浅拷贝

浅拷贝就是成员数据之间的一一赋值&#xff1a;把值赋给一一赋给要拷贝的值。但是可能会有这样的情况&#xff1a;对象还包含资源&#xff0c;这里的资源可以值堆资源&#xff0c;或者一个文件。。当 值拷贝的时候&#xff0c;两个对象就有用共同的资源&#xff0c;同时对资源可…

【OpenCV】使用过的函数汇总

1、类 Mat&#xff1a;矩阵matrix&#xff0c;opencv2中主要用来封装图片数据 InputArray&#xff1a;输入参数 &#xff0c;约等于Mat OutputArray&#xff1a;输出参数&#xff0c;约等于Mat Rect&#xff1a;表示矩形 2、函数 imread();//从文件中读取图片到Mat中 imwrit…

春招来袭!程序员如何拿下硅谷顶级公司200万年薪?

还记得那个在去年&#xff0c;用 6 天时间参加了 LinkedIn、Yelp、Apple、亚马逊、Facebook 和 Google 的面试&#xff0c;并拿下了 6 份 Offer 的“别人家的程序员”吗&#xff1f;之后&#xff0c;他又在这几份工作中进行了选择&#xff0c;一步步谈下了 30 万美元&#xff0…

wake_lock_timeout的使用方法【转】

本文转载自&#xff1a;http://blog.csdn.net/liuxd3000/article/details/44224849 今天有用到用ec43_GPIO的中断来唤醒系统&#xff0c;将系统从深度休眠中唤醒并保证系统wakup 一段时间用过了&#xff0c;方法如下&#xff0c;有同样使用的童鞋可以参考一下&#xff01;1. …

函数05 - 零基础入门学习C语言36

第七章&#xff1a;函数05 让编程改变世界 Change the world by program 函数的嵌套调用 嵌套定义就是在定义一个函数时&#xff0c;其函数体内又包含另一个函数的完整定义。 然而&#xff0c;&#xff23;语言不能嵌套定义函数&#xff0c;但可以嵌套调用函数&#xff0c;…

【linux】可执行程序执行时报错-sh: ./mxc_v4l2_tvin.out: No such file or directory的解决方法

问题 在imx6开发板上执行 ./mxc_v4l2_tvin.out时报错&#xff1a; -sh: ./mxc_v4l2_tvin.out: No such file or directory 原因查找 1、路径问题&#xff1a;确定在当前目录下有该程序&#xff0c;没问题&#xff1b; 2、使用ls -l查看可以执行权限&#xff0c;没问题&…

展望2018:WebRTC大规模商用元年

历经6年长跑&#xff0c;WebRTC终于在去年迎来了1.0标准&#xff08;candidate recommendation&#xff09;的发布&#xff0c;而它也将成为2018年视频通信商业应用场景爆发的主要技术推动力。一站式WebRTC通信技术提供商Zealcomm公司创始人、CEO冯昶对WebRTC在国内外发展历程、…

暴雪游戏遭遇AI“实力”坑队友:四处游走,还不参与战斗

作者 | 琥珀 出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 60s测试&#xff1a;你是否适合转型人工智能&#xff1f; https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw “打游戏 AI 将完胜人类&#xff01;&#xff1f;” 抱歉&#xff0c;这个 Flag 还是不…

linux/nginx 安全增强

这有一篇很好的文章. 评论中有好的补充 http://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html转载于:https://www.cnblogs.com/pengxl/archive/2010/12/08/1900175.html

十年程序员的告诫:千万不要重写代码!

对重写代码说不。 作者 | Roman Luzgin 译者 | 苏本如 责编 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNNews&#xff09; 以下为译文&#xff1a; 重写代码消耗了12个月&#xff01; 我们从头开始重写代码浪费的时间。 你能想象在软件行业&#xff0c;12个月的时…

RabbitMQ 实战(四)消费者 ack 以及 生产者 confirms

2019独角兽企业重金招聘Python工程师标准>>> 这篇文章主要讲 RabbitMQ 中 消费者 ack 以及 生产者 confirms。 如上图&#xff0c;生产者把消息发送到 RabbitMQ&#xff0c;然后 RabbitMQ 再把消息投递到消费者。 生产者和 RabbitMQ&#xff0c;以及 RabbitMQ 和消费…

【imx6】/dev中fb和video的对应关系

imx6q关于fb和video的设备信息 设备节点 rootmyzr:/unit_tests# ls /dev/fb* -l lrwxrwxrwx 1 root root 3 Jan 1 1970 /dev/fb -> fb0 crw-rw---- 1 root video 29, 0 Jan 1 1970 /dev/fb0 crw-rw---- 1 root video 29, 1 Jan 1 1970 /dev/fb1 crw-rw---- 1 r…