计算机原理基础

  • 计算机是由多个硬件组合组成,常见的硬件有:CPU、硬盘、内存、网卡、显示器、机箱、电源。。。
  • 注意事项:机械将零件组合在一起,他们之间是无法进行协作。
前提: 简述 cpu 内存 硬盘 操作系统 应用程序
cpu: 计算机的运算核心和控制核心,就好像人类的\'大脑\'。
内存: 负责数据与cpu直接数据交流处理,将临时数据和应用程序加载到内存,然后交由cpu处理。
      4g,8g,16g,32g
      造价高,断电即消失
硬盘: 磁盘(d盘,e盘)长久的存储数据:文件,应用程序。片二等数据,断电不消失
操作系统: 控制调度 硬件与软件资源额计算机程序,它是计算机最大的软件
  • 操作系统

用于协调计算机的各个硬件,让硬件之间进行协同工作,已完成某个目标。
常见的操作系统分类:
- windows,优点:生态牛逼、工具多;缺点:略慢、收费。【个人】
- XP
- win7
- win8
- win10
...
- linux,优点:资源占用少、免费(很多公司的服务器上安装linux);缺点:工具少、告别游戏。【企业的服务器】
- centos
- ubuntu
- redhat
...
- mac,优点:生态还行、工具差不多都有、用户体验和交互;缺点:不能玩游戏
  • 软件

安装操作系统之后,我们会在自己电脑上安装一些常用的软件,例如:QQ、杀毒、微信…问题来了,这些软件是否谁开发的?是否各大公司的程序员开发的,可以把软件理解为一大堆的代码(一篇文章)。

  • 编程语言

软件,是由程序员使用编程语言开发出来的一大堆代码的集合。全球的编程语言有2500+多种,常见的编程语言:Java、C#、Python、PHP、C…

作文,是由小学生使用汉语/英语/法语/日语…写出来的一大堆的文字集合。

学习编程语言就是学习他的语法,根据语法再去编写相应的软件中的功能。

  •  编译器/解释器

编译器/解释器,就是一个翻译官,将代码翻译成计算机能够识别的命令。

A使用Pyton开发了一个软件         B使用Golang开发了一个软件
    Python解释器                   Golang编译器
                        操作系统
                CPU 硬盘  网卡  内存  电源  ......

为什么有的叫解释器?有的叫编译器?

  • 解释器,实时翻译。拿到1000行代码之后,解释一句交给操作系统一句。

  • 编译器,全文翻译。拿到2000行之后会将它饼啊议程一个临时文件(计算机能够识别命令),再把文件交给操作系统去读取。

Python、PHP、javascript、Ruby…一般称为解释型语言

C、C++、Go、Java…一般称为编译型语言

一、Python的由来

  python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。Python的名字来自Guido所挚爱的电视剧Monty Python\’s Filting Circus。他项这个这个新的叫做Python的语言,能符合他的理想:创造一种C和shell之间,功能全面,易学易用、可扩展的语言。

  最新的TIOBE排行榜,Python排名第二。

  

  由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!!

  Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有:自动化运维、自动化测试、大数据分析、爬虫、Web 等。

1.为什么是Python而不是其他语言?

C 和 Python、Java、C#等

    C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作

其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行

Python 和 C  Python这门语言是由C开发而来

  对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.
  对于速度:Python的运行速度相较与C,绝逼是慢了

Python 和 Java、C#等

  对于使用:Linux原装Python,其他语言没有;以上几门语言都有非常丰富的类库支持
  对于速度:Python在速度上可能稍显逊色

所以,Python和其他语言没有什么本质区别,其他区别在于:擅长某领域、人才丰富、先入为主。

2.Python解释器种类

Cpython
    Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。
Jyhton
    Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。
IronPython
    Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似)
PyPy(特殊)
    Python实现的Python,将Python的字节码字节码再编译成机器码。
RubyPython、Brython …

3.python的语言分类

  • 翻译的维度

    • 解释型语言:Python、PHP等

    • 编译型语言:C、Java、Golang

解释型:将代码一行一行的解释成二进制,然后逐行执行。
	缺点:执行效率低。
	优点:开发效率高,可以跨平台。
	代表语言:python。
编译型:将代码全部一次性编译成二进制,然后在执行。
	缺点:开发效率低,不能跨平台。
	优点:执行效率高。
	代表语言:C。
  • 高低的维度

    • 低级编程语言,写出来的代码可以被计算机识别

      机器语言,101 001 00001 00010 00101100000011100,机器码,交给计算机去执行
      汇编语言,MOV INC,指令,交给计算机去执行
    • 高级编程语言,写出来的代码无法直接被计算机识别,但可以通过某种范式将其转换为计算机可以识别的语言

      C C++ Java Python Ruby... 这类编程语言在编写代码是几乎是写英语作文
      交由相关编译器或解释器翻译成机器码,然后再交给计算机去执行。
    • 注意:现在基本上都是用高级编程语言

4.python的优缺点

优点:
	1,优美清新简单,入门容易,如果深入研究,可以写出非常非常复杂的程序。
	2,开发效率高。
	3,高级语言。
	4,可移植性。
	5,可嵌入性。
	6,可拓展性。

缺点:
	1,运行速度慢。
	2,源码不能加密。
	3,由于有GIL锁的存在,不能利用多线程。

5.python2和python3的区别

源码上的区别:
	pyhton2x:源码不规范。源码重复率较高。源码冗余。
	python3x:源码识重新整合,符合优美清晰简单的原则。

编码方式的区别:
	python3x:编码方式默认是utf-8,可以支持中文,英文。
	python2x:编码方式默认是ASCII,只包含英文字母,数字,特殊字符如果想显示中文:在首行加上# -*- encoding:utf-8 -*-。

二、Python环境安装

  1.安装Python

  • 下载安装包:   

官网:https://www.python.org/downloads/ 选择对应版本的Python下载即可

淘宝镜像:https://npm.taobao.org/mirrors/python/

    • 安装路径:默认C盘   路径也可以选择。比如D:/python3
    • 配置环境变量   不过要记得配置环境变量 右键【计算机】–》【属性】–》【高级系统设置】–》【高级】–》【环境变量】–》【在第二个内容框中找到 变量名为Path 的一行,双击】 –> 【Python安装目录追加到变值值中,低于win10版本用:分割】

  2.更新Python

      windows:卸载重装即可

  3.安装第三方包

    pip install package_name  或者 在pycharm中settings中安装

三、编码(密码本)

计算机中所有数据本质上都是以0和1的组合来存储

在计算机中会将中文内存转换成010101010101…,最终存储到硬盘上。

在计算机中有这么一个编码的概念(密码本)。

张   -->   01111101  00110011  10101001 
亚   -->   11010100  11000100  10101010
飞   -->   01010101  10101000  11000000

在计算机中有多种编码

每种编码都有自己的一套密码本, 都维护着自己的一套规则,如:
    utf-8编码:
        张   -->   01111101  00110011  10101001 
         亚   -->   11010100  11000100  10101010
         飞   -->   01010101  10101000  11000000
    gbk编码:
        张   -->   11110101  10101001 00110011 
         亚   -->   11000000  11000100 10101010
         飞   -->   10101000  11010100 01010101  
所以,使用不同的编码保存文件时,硬盘的文件中存储的0/1也是不同的。

  注意事项:以某个编码的形式进行保存文件,以后就要以这种编码去打开这个文件,否则就会出现乱码。

UTF-8编码去保存一个文件,GBK编码形式去打开,乱码

   乱码的出现因为文件的存储方式和打开方式不一致导致。另外,如果数据丢失也可可能会造成乱码。

例如:张,对应存储的是:100011000111000111011,如果文件中的内容丢失只剩下100011000111000,则读取时候就可能出现乱码。

四. 编程初体验

  • 编码必须要保持:保存和打开一致,否则会乱码。

  • 默认Python解释器是以UTF-8编码形式打开文件,如果想要修改Python的默认解释器编码,可以这样做:

    # -*- coding:gbk -*-
    ​
    print(\'!\')
  • 建议:所有Python代码文件都要以UTF-8编码保存和读取

  • 补充:运行方式有两种 (1)在编辑器中编辑好py文件,保存。在命令行下到当前目录执行python 文件名.py (2)在有python编译环境的编辑器里直接点解运行即可。如eclipse,pycharm。

  • Python内部执行流程

 

  • pyc文件

    执行Python代码时,如果导入了其他的 .py 文件,那么,执行过程中会自动生成一个与其同名的 .pyc 文件,该文件就是Python解释器编译之后产生的字节码。

    ps:代码经过编译可以产生字节码;字节码通过反编译也可以得到代码。

五. 输入和输出

5.1 输出——print(\’xxx\’, end=\’\’)

def print(self, *args, sep=\' \', end=\'\n\', file=None): # known special case of print

    将结果或内容呈现给用户。

print(\'\')
print("                           _ooOoo_  ")
print("                          o8888888o  ")
print("                          88  .  88  ")
print("                          (| -_- |)  ")
print("                           O\\ = /O  ")
print("                       ____/`---\'\\____  ")
print("                     .   \' \\| |// `.  ")
print("                      / \\||| : |||// \\  ")
print("                    / _||||| -:- |||||- \\  ")
print("                      | | \\\\\\ - /// | |  ")
print("                    | \\_| \'\'\\---/\'\' | |  ")
print("                     \\ .-\\__ `-` ___/-. /  ")
print("                  ___`. .\' /--.--\\ `. . __  ")
print("               ."" \'< `.___\\_<|>_/___.\' >\'"".  ")
print("              | | : `- \\`.;`\\ _ /`;.`/ - ` : | |  ")
print("                \\ \\ `-. \\_ __\\ /__ _/ .-` / /  ")
print("        ======`-.____`-.___\\_____/___.-`____.-\'======  ")
print("                           `=---=\'  ")
print("  ")
print("        .............................................  ")
print("                 佛祖镇楼                  BUG辟易  ")
print("         佛曰:  ")
print("                 写字楼里写字间,写字间里程序员;  ")
print("                 程序人员写程序,又拿程序换酒钱。  ")
print("                 酒醒只在网上坐,酒醉还来网下眠;  ")
print("                 酒醉酒醒日复日,网上网下年复年。  ")
print("                 但愿老死电脑间,不愿鞠躬老板前;  ")
print("                 奔驰宝马贵者趣,公交自行程序员。  ")
print("                 别人笑我忒疯癫,我笑自己命太贱;  ")
print("                 不见满街漂亮妹,哪个归得程序员?")

关于输出

  • 默认print在尾部会加换行符

    print(\'文能提笔安天下\')
    print(\'武能上马定乾坤\')
    ​
    输出:
    文能提笔安天下
    武能上马定乾坤
  • 想要不换行,则可以这样做

    print(\'文能提笔安天下\', end=\'\')
    print(\'武能上马定乾坤\', end=\'\')
    ​
    输出:
    文能提笔安天下武能上马定乾坤
    print(\'文能提笔安天下\', end=\',\')
    print(\'武能上马定乾坤\', end=\'。\')
    ​
    输出:
    文能提笔安天下,武能上马定乾坤。
  • 练习

  1. 使用print输出自己的姓名

  2. 使用print输出

    床前明月光,
    疑是地上霜。 
    举头望明月,
    低头思故乡。
  3. 使用print输出

    床前明月光,疑是地上霜。举头望明月,低头思故乡。

5.2 输入——input(‘xxx’),可以实现程序和用户之间的交互。

# -*- coding:utf-8 -*-

 #1.使用input获取必要的信息
name =input("请输入名字:")
qq=input("请输入qq:")

#2.使用print来打印名片
print("="*20)
print("姓名:%s"%name)
print("qq:%s"%qq)
print("="*20)

输入密码时,如果想要不可见,需要利用getpass 模块中的 getpass方法,即:

import getpass
 
username = input(\'请输入用户名:\')
pwd = getpass.getpass(\'请输入密码:\')
print(username,pwd)

特别注意:用户输入的任何内容本质上都是字符串。

  • 练习
  1. 提示输入姓名,然后给邢明后面拼接一个“烧饼”,并提示输入姓名,最终打印结果

  2. 提示输入姓名/位置/行为,然后做拼接并打印: xx在xx做xx

  3. 提示输入两个数字,计算两个数的和。

六. 初识数据类型

上学时,老师叫我们数字、拼音、汉字、真假判断等,然后我们根据学到的内容写作文,老师来检查并打分。

现在学编程,教大家int、str、bool等,然后大家根据这些内容来写代码,写完代码交给Python解释器去运行。

6.1 整型(int)

整型,整数

# 整型
print(666)
# 整型加法
print(2 + 10)
# 整型乘法
print(2 * 10)
# 整型除法
print(10 / 2)
# 整型取余
print(10 % 3)
# 次方
print(2 ** 4)

2 是一个整数的例子。
  长整数 不过是大一些的整数。
  3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。
  (-5+4j)和(2.3-4.6j)是复数的例子。
  int(整型)
    在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647    在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
  long(长整型)    跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。    注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。  float(浮点型)    浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。  complex(复数)    复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。
  注:Python中存在小数字池:-5 ~ 257

其他

6.2 字符串(str)

字符串,其实就是生活中的文本信息,例如:姓名、地址、自我介绍等。

(1)引号创建字符串

字符串有一个特点,他必须由引号引起来,引号可以是\’x\’、”x”、\’\’\’x\’\’\’、”””x”””如:

  • 单行字符串

    print(\'我是张亚飞\')
    print("我是张亚飞")
    print("我是\'张亚飞\'")
    print(\'我是"张亚飞"\')
  • 多行字符串

    print("中国山西晋中市")
    print(\'\'\'中国山西晋中市
    xxxxxxxxx
    xxxxxxxx
    xxxxxxx
    \'\'\')
    print("""中国山西晋中市
    xxxxxxxxx
    xxxxxxxx
    xxxxxxx
    """)

(2)字符串运算

  • 加,两个字符串可以使用+将多个字符串拼接起来。例如:’aa’+ ’bb’ ==>’aabb’。又称为字符串拼接。

(1) 如果+两边都是字符串,则拼接。

(2) 如果+两边都是数字,则加法运算。

(3) 如果+两边类型不同,则抛出异常。

(4) 可以将多个字面字符串直接放到一起实现拼接。例如:’aa’’bb’==>’aabb’

print("君子" + "成人之美")
  • 乘,整型和字符串相乘,以实现让字符串重复出现N次并拼接起来。又称为字符串复制。

    print("我想吃饺子我想吃饺子我想吃饺子我想吃饺子")
    print(\'我想吃饺子\' * 4)
    ​
    输出
    我想吃饺子我想吃饺子我想吃饺子我想吃饺子
    我想吃饺子我想吃饺子我想吃饺子我想吃饺子

6.3 布尔类型

布尔类型中共有两个值:True/False

print(1 > 2)
print(False)
​
print(1 == 1)
print(True)
username = input(\'请输入你的用户名:\')
password = input(\'请输入密码:\')
​
if username == \'曹晓华\' and password == \'666666\':
    print(\'用户登录成功\')
else:
    print(\'用户登录失败\')

补充:

1 > 2
1 == 3

\'hello\' > \'world\'
1 > \'hello\'

进行逻辑判断(比如if)时,Python当中等于False的值并不只有False一个,它也有一套规则。对于基本类型来说,基本上每个类型都存在一个值会被判定为False。大致是这样:

布尔型,False表示False,其他为True
整数和浮点数,0表示False,其他为True
字符串和类字符串类型(包括bytes和unicode),空字符串表示False,其他为True
序列类型(包括tuple,list,dict,set等),空表示False,非空表示True
None永远表示False
自定义类型则服从下面的规则:

如果定义了__nonzero__()方法,会调用这个方法,并按照返回值判断这个对象等价于True还是False
如果没有定义__nonzero__方法但定义了__len__方法,会调用__len__方法,当返回0时为False,否则为True(这样就跟内置类型为空时对应False相同了)
如果都没有定义,所有的对象都是True,只有None对应False
 

所以回到问题,not None的确会返回True。不过一定要警惕的是,if a is None和if a,if a is not None和if not a不可以随便混用,前面也说过了,它们在很多时候是不同的,比如说当a是一个列表的时候if not a其实是判断a为None或者为空。

python中False和None

6.4 类型转换

上文对数据类型int/str/bool有了初步了解,他们都有自己的定义方式:

  • int,整数定义时,必须是数字且无引号,例如:5,8,9

  • str,字符串定义时,必须用双引号括起来,例如:”中国”,”陈月”,”666″

  • bool,布尔值定义时,只能写True和False

不同数据类型有不同的功能,例如:整型可以加减乘除而字符串只能加(拼接)和乘法。

如果想要做转换可遵循一个基本规则:想转换什么数据类型就让他包裹一层该数据类型。

例如:str(666) == “666”是让整型咋混换为字符串,int(\’888\’) == 888是字符串转整型。

  • 转换为整型

    # 字符串转换为整型(渡可渡之人)
    int(\'666\')
    int(\'999\')
    
    \'6\' + \'9\' == \'69\'
    int(\'6\') + int(\'9\') == 15
    
    int(\'今天天气真好\')  # 报错
    
    # 布尔类型转换为整型
    int(True)   转换完等于1
    int(False)  转换完等于0
  • 转换为字符串

    # 整型转字符串
    str(234)
    str(666) + str(999) 结果为 \'666999\'
    ​
    # 布尔类型转换为字符串
    str(True)   "True"
    str(False)  "False"
  • 转换为布尔类型

    # 整型转布尔
    bool(1)  True
    bool(2)  True
    bool(0)  False
    bool(-10)  True
    ​
    # 字符串转布尔
    bool(\'nice\')  True
    bool(\'自作自受\') True
    bool(\'\') False
    bool(\' \') True
  • 三句话搞定类型转换

    • 其他所有类型转换为布尔类型时,除了空字符串、0以为其他都是True。

    • 字符串转整型时,只有那种”888″格式的字符串才可以转换为整型,其他都报错。

    • 想要转换为哪种类型,就用这类型的英文包裹一下就行。

    str(...)
    int(...)
    bool(...)

七. 变量

变量,其实就是我们生活中起别名和外号,让变量名指向某个值,格式为:【变量名=值】,以后可以通过变量名来操作其对应的值。

变量的作用:昵称,其代指内存里某个地址中保存的内容

  • 变量的赋值
score=100  #定义了一个变量,这个变量的名字叫做score,它里面存储了一个数值100
high = 180   #单位是cm

appleprice = 3.5 #苹果的价格 元/斤
weight = 7.5     #购买的苹果的重量 斤

money = appleprice * weight  #如果money是第一次的话,那么就表示定义这个变量

money = money - 10   #如果money=xxxx不是第一次出现,那么就不是定义一个变量,而是给这个变量附上一个新的值
name = \'张亚飞\'
print(name)  # 张亚飞
age = 18
name = \'xiaoming\'
flag = 1 > 18
address = \'山西太原\' + \'迎泽\'
addr = \'山西太原\' + \'迎泽\' + name 
​
print(addr)
print(flag)

注意:

  • 给变量赋值age = 18

  • 让age代指值age = 18

7.1 变量名的规范

age = 18
name = \'xiaoming\'
flag = 1 > 18
address = \'山西太原\' + \'迎泽\'

三个规范:(不符合规范会报错)

  • 变量名只能有字母、数字、下划线组成

  • 不能以数字开头

    na6me6 = "xiaoming"
  • 不能用Python内置关键字

    In [3]: help(\'keywords\')
    ​
    Here is a list of the Python keywords.  Enter any keyword to get more help.
    ​
    False               def                 if                  raise
    None                del                 import              return
    True                elif                in                  try
    and                 else                is                  while
    as                  except              lambda              with
    assert              finally             nonlocal            yield
    break               for                 not
    class               from                or
    continue            global              pass

其他常见帮助函数

查看python所有的modules:help("modules")

单看python所有的modules中包含指定字符串的modules: help("modules yourstr")

查看python中常见的topics: help("topics")

查看python标准库中的module:import os.path + help("os.path")

查看python内置的类型:help("list")

查看python类型的成员方法:help("str.find") 

查看python内置函数:help("open")

建议:

  • 下划线连接命名(小写)

    englishScore = 100  #小驼峰
    english_score = 100  #下划线,推荐
    EnglishScore = 100   #大驼峰
    englishscore = 100  #不推介
  • 见名知意

7.2 变量内存指向关系

学习上述变量知识让我们对变量有了初步认识,接下来我们从稍微高级点的角度来学习变量。即内存指向(在电脑内存中是怎么存储的)。

情景一:

name = \'zhangyafei\'   #定义了一个变量,这个变量的名字叫做name,它里面存储了一个数值zhangyafei

在计算机内存中创建一块区域保存字符串“zhangyafei”,name变量名则指向这块区域。

img

情景二:

name = \'zhangyafei\'
name = \'xiaoming\'

在计算机内存中创建一块区域保存字符串‘zhangyafei’,name变量名则指向这块区域。然后又再向内存中创建了一块区域保存字符串‘\’xiaoming”,name变量名则指向”xiaoming“所在的区域,不再指向”zhangyafei“所在区域(无人指向的数据会被标记为垃圾,由解释器自动化回收)

情景三

name = \'zhangyafei\'
new_name = name

在计算机内存中创建一块区域保存字符串‘zhangyafei’,name变量名则指向这块区域。new_name变量名指向name变量,因为被指向的是变量名,所以自动转指向到name变量代表的内存区域。

情景四

name = \'zhangyafei\'
new_name = name
name = \'xiaoming\'

在计算机内存中创建一块区域保存字符串‘zhangyafei’,name变量名则指向这块区域。new_name变量名指向name所指向的内存区域,最后又创建了一个区域存放’xiaoming‘,让name变量指向xiaoming\’所在区域。

情景五

num = 18
age = str(num)

在计算机的内存中创建一块区域保存整型18,name变量名则指向这块区域。通过类型转换依据整型18再在内存中创建一个字符串“18”,age变量指向保存这个字符串的内存区域。

八. 注释

写代码时候如果想要对某内容进行注释处理,及:解释器忽略不会按照代码去执行

  • 单行注释

    # 声明一个name含量
    name = \'xiaoming\'
    ​
    age = 19 # 当前用户年龄
    ​
    注意:快键键 command + ? 和ctrl + ?
  • 多行注释

    # 声明一个name含量
    # 声明一个name含量
    # 声明一个name含量
    name = \'xiaoming\'
    ​
    """
    多行注释内容
    多行注释内容
    多行注释内容
    """
    age = 19 # 当前用户年龄

九. 条件语句

# 基本语句
if 条件: 条件成立之后执行的代码... 条件成立之后执行的代码... 条件成立之后执行的代码... else: 条件不成立之后执行的代码... 条件不成立之后执行的代码... 条件不成立之后执行的代码...
 5种方式(甚至更多)
    1 单独的if或者if not
    2 if else
    3 if elif ....
    4 if elif ..... else
    5 if 嵌套
注意标点符号: 一定要是英文。:
注意四个空格缩进,代码块。
  • 示例代码
  • 需求一:用户登录验证
    • 提示输入用户名和密码
    • 验证用户名和密码
    • 如果错误,则输出用户名或密码错误
    • 如果成功,则输出 欢迎,XXX!

import getpass
 
name = input(\'请输入用户名:\')
pwd = getpass.getpass(\'请输入密码:\')
 
if name == "zhangyafei" and pwd == "nb":
    print("欢迎,zhangyafei!")
else:
    print("用户名和密码错误"

用户登录代码示例

提醒:统一缩进问题(都是使用四个空格 = tab)

  • 需求二:根据用户输入内容输出其权限

# -*- coding: utf8 -*-

name = input(\'请输入用户名:\')


if name == "zhang":
    print("超级管理员")
elif name == "chen":
    print("普通管理员")
elif name == "zhao":
    print("业务主管")
else:
    print("普通用户"

用户权限代码示例

10.1 基本条件语句

  • 示例1

    print(\'开始\')
    if true:
        print(\'123\')
    else:
        print(\'456\')
     print(\'结束\')
    ​
    # 输出结果
    开始
    123
    结束
  • 示例2

    print(\'开始\')
    if 5 == 5:
        print(\'123\')
    else:
        print(\'456\')
     print(\'结束\')
  • 示例3

    num = 18
    if num > 10:
        print(\'num变量对应的值大于10\')
    else:
        print(\'num变量对应的值不大于10\')
  • 示例4

    username = \'zhangyafei\'
    password = \'666\'
    if username == \'zhangyafei\' and password == \'666\':
        print(\'登录成功\')
    else:
        print(\'登录失败\')
  • 示例5

    username = \'zhangyafei\'
    if username == \'zhangyafei\' or password == \'xiaoming\':
        print(\'VIP会员用户\')
    else:
        print(\'普通会员\')
  • 示例6

    num = 19
    if num % 2 == 1:
        print(\'num是奇数\')
    else:
        print(\'num是偶数\')
    num = 19
    data = num % 2 == 1
    if data:
        print(\'num是奇数\')
    else:
        print(\'num是偶数\')
  • 示例7

    if 条件
        成立
    print(\'开始\')
    if 5 == 5:
        print(\'123\')
     print(\'结束\')

10.2 多条件判断

if 条件A:
    A成立,执行此缩进中的代码
    ...
elif 条件B:
    B成立,执行此缩进中的代码
    ...
elif 条件C:
    C成立,执行此缩进中的代码
    ...
else:
    上述都不成立
score == input(\'请输入分数:\')
data = int(score)
​
if data > 90:
    print(\'优\')
elif data > 80:
    print(\'良\')
elif data > 70:
    print(\'中\')
elif data > 60:
    print(\'差\')
else:
    print(\'不及格\')

10.3 条件嵌套

if 条件A:
    A成立,执行此缩进中的代码
    ...
elif 条件B:
    B成立,执行此缩进中的代码
    ...
else:
    上述都不成立
if 条件A:
    if 条件A1:
        ...
    else:
        ...
elif 条件B:
    B成立,执行此缩进中的代码
    ...
else:
    上述都不成立
  • 总结
if 条件:
    xxxx


if  条件:
    xxxxxx1
else:
    xxxxx2


if 条件1:
    xxxx1
elif 条件2:
    xxxx2
elif 条件3:
    xxxx3
else:
……

嵌套

if 嵌套
if xxx:
    print("---1----")
    if xxx2:
        xxxxxxx
  • 示例1:模拟10086客服

print(\'欢迎致电10086,我们提供了如下服务:1.话费相关;2.业务办理;3.人工服务\')
​
choice = input(\'请选择服务序号:\')
​
if choice == \'1\':
    print(\'花费相关业务\')
    cost = input(\'查询花费请按1;交话费请按2\')
    if cost == \'1\':
        print(\'话费余额为100\')
    elif cost == \'2\':
        print(\'交话费\')
    else:
        print(\'输入错误\')
elif choice == \'2\':
    print(\'业务办理\')
elif choice == \'3\':
    print(\'人工服务\')
else:
    print(\'序号输入错误\')

模拟10086

  • 示例2:白富美

# 如果当前用户是男性的话,难么就输入判断女性的要求
sex = input("输入你的性别:")
if sex == "":
    color = input("你白吗?")  # 白或者黄
    money = int(input("请输入你的财产总和:"))  # 输入1000
    beautiful = input("你美吗?")  # 美 或者不美
    # if 白 并且 富 并且 美
    # if 白 and 富 and,美:
    if color == "" and money > 1000000 and beautiful == "":
        print("白富美……")
        print("好羡慕……")
    else:
        print("黑穷丑……")
else:
    print("判断女性的要求在下面")
    color = input("你高吗?")  # 白或者黄
    money = int(input("请输入你的财产总和:"))  # 输入1000
    beautiful = input("你帅吗?")  # 美 或者不美
    # if 白 并且 富 并且 美
    # if 白 and 富 and,美:
    if color == "" and money > 1000000 and beautiful == "":
        print("高富帅……")
        print("好羡慕……")
    else:
        print("矮穷矬……")

白富美

  • 示例3:判断星期几

num = int(input("输入一个数字(1-7):"))

# 2. 判断用户的数据,并且显示对应的信息
if num == 1:
    print("Monday")
elif num == 2:
    print("Tuesday")
elif num == 3:
    print("Wednesday")
elif num == 4:
    print("Thursday")
elif num == 5:
    print("Friday")
elif num == 6:
    print("Saturday")
elif num == 7:
    print("sunday")
else:
    print("您输入的数字有误"

判断星期几

  • 示例4:上火车

ticket = 1  # 1 表示有车票 0 表示没有车票
knife_lenght = 48  # cm

# 先判断是都有车票
if ticket == 1:
    print("通过了车票的检测,进入到了车站,接下来要安检了")
    # 盘DAU拿到的长度是否合法
    if knife_lenght <= 10:
        print("通过了安检,进入了候车厅")
        print("马上就要见到她了,好开心……")
    else:
        print("安检没有通过,等待公安处理")
else:
    print("兄弟,你还没有买票呢,先去买票,才能进站……")

上火车

  • 示例5:石头剪子布

import random

# 1.提示并获取用户的输入
player = int(input("请输入剪刀(0)石头(1)布(2):"))

# 2.让电脑出一个
computer = random.randint(0, 2)
print(f\'你出的{player}, 电脑出的{computer}\')

# 3.判断用户的输入,然后显示对应的结果
# if 玩家获胜的条件:
if (player == 0 and computer == 2) or (player == 1 and computer == 0) or (player == 2 and computer == 1):
    print("赢了,可以去买奶粉了。")
# elif 玩家平局的条件:
elif player == computer:
    print("平局了,洗洗手决战到天亮")
else:
    print("输了,回家拿钱 再来。。")

石头剪子布

10.4 三目运算符

result = value1 if  条件 else value2
如果条件为真:result = value1
如果条件为假:result = value2

另一种写法

result = [value1,value2][条件]

十一、运算符

提到运算符,我想大家首先想到的就是加、减、乘、除之类, 本节要系统的跟大家来聊一聊,我们写代码时常见的运算符可以分为5种:

  • 算数运算符,例如:加减乘除

 

  • 位运算符
运算符 含义 示例
& 按位与(AND):参与运算的两个值的两个相应位都为1,则该位的结果为1;否则为0 x & y
| 按位或(OR):参与运算的两个值的两个相应位有一个为1,则该位的结果为1;否则为0 x | y
~ 按位翻转/取反(NOT):对数据的每个二进制位取反,即把 1 变为 0 ,把 0 变为 1 ~x
^ 按位异或(XOR):当两个对应的二进制位相异时,结果为1 x ^ y
>> 按位右移 :运算数的各个二进制位全部右移若干位 x >> 2
<< 按位左移:运算数的各个二进制位全部左移若干位,高位丢弃,地位不补 0 x << 2
>>> a=10           #a=0000 1010
>>> b=8            #b=0000 1000
>>> a & b          #0000 1000
8
>>> a | b          #0000 1010
10
>>> a ^ b          #0000 0010
2
>>> c=~a           #a的补码 = 原码 = 0000 1010  (0000 1010)取反 (1111 0101)
>>> print(c)       #(1111 0101)取反(0000 1010)
-11                #(0000 1010)+ (0000 0001) = (0000 1011) (前面加上负号)
>>> c=a>>2        #a=0000 1001
>>> print(c)      #c=0000 0010
2
>>> c=a<<2        #c=0010 1000
>>> print(c)
  • 单目运算符

~num 单目运算,对数的每一位取反,结果为 -(num+1)

    • 在计算机里面,负数是以补码存储的 
    • 原码求补码:取反,+1
    • 补码求原码:取反,+1
    • 取反操作是在原码上进行的!
(1) 求~4, 我们用二进制来表示4: 
    4 的原码: 0000 0100 
    取反得到: 1111 1011, 观察符号,是负数,因为负数以补码存储的,所以问题转化为: 
    某个数 x 的补码是 1111 1011,求 x 的值(由补码求原码) 
    取反: 0000 0100 
    +1: 0000 0101 = 5, 加上标点符号(负号) 得到结果: -5

(2) 求 ~-5,同理用二进制表示-5: 
    因为 -5 是负数,所以它是以 5 的补码表示的,所以转化为已知 5 的补码,求对应的原码,然后在取反. 
    5补码: 0000 0101, 
    取反: 1111 1010 
    +1: 1111 1011, 得到原码 
取反: 0000 0100 = 4 ,加上标点负号(正号)得到结果:4
  • 比较运算符,例如:大于、小于 

    • 注意:python3中不支持 <>

      if 1 >2:
        pass
      while 1>2:
        pass
      ​
      data = 1 == 2
  • 身份运算符

身份运算符用于检查两个值(或变量)是否位于存储器的同一部分。

注意: 两个变量相等,并不意味着它们也相同。

运算符 含义 示例
is 如果对象的引用指向同一片内存,则为 True(引用同一个对象) x is True
is not 如果对象的引用不相同,则为 True(引用不同的对象) x is not True
In [17]: a
Out[17]: [1, 2, 3, 4]

In [18]: b
Out[18]: [1, 2, 3, 4]

In [19]: z =[1,2,3,4]

In [20]: id(z)
Out[20]: 2364643425928

In [21]: a == b
Out[21]: True

In [22]: a == z
Out[22]: True

In [23]: id(a)
Out[23]: 2364642806856

In [24]: id(z)
Out[24]: 2364643425928

In [25]: a is b
Out[25]: True

In [26]: a is z
Out[26]: False

In [27]: b is z
Out[27]: False
  • 成员运算,例如:是否包含

v1 = "am" in "james"  # True/False
# 让用户输入一段文本,检测文本中是否包含敏感词。
text = input("请输入内容:")
if "黄" in text or "赌" in text or "毒" in text:
  print("含有敏感词汇,不予显示")
else:
  print(text)
  • 逻辑运算,例如:且或非 

if username == "james" and pwd == "123":
  pass
​
data = 1 > 2
if not data:
  pass
  • 赋值运算符

11.1 运算符优先级

  • 从低到高
种类 运算符 描述
逻辑运算符   or 布尔“或”
and 布尔“与”
not x 布尔“非”
成员运算符 in,not in 成员测试
身份运算符 is,is not 同一性测试
比较运算符 <,<=,>,>=,!=,== 比较
位运算符    | 按位或
^ 按位异或
& 按位与
<<,>> 移位
算数运算符  +,- 加法与减法
*,/,% 乘法、除法与取余
  +x,-x 正负号
  ~x 按位翻转
  ** 指数
赋值运算符 = 赋值运算

算数优先级优先级 大于 比较运算符运算符的优先级有很多,常见的没几个,推荐你记住3个即可:

  • if 2 + 10 > 11:
        print("真")
    else:
        print("假")
  • 比较运算符优先级 大于 逻辑运算符

    if 1>2 and 2<10:
        print("成立")
    else:
        print("不成立")
  • 逻辑运算符内部三个优先级 not > and > or

    if not 1 and 1>2 or 3 == 8:
        print("真")
    else:
        print("假")

上述所有运算符优先级从高到低总结:算数运算符 > 位运算符 > 比较运算符 > 身份运算符 > 成员运算符 > 逻辑运算符 > 赋值运算符

绝招:加括号。

11.2 题目

  • 逻辑运算符:and、or运算规则
    • x or y 的值只可能是x或y. x为真就是x, x为假就是y

    • x and y 的值只可能是x或y. x为真就是y, x为假就是x

v1 = name == "james" and pwd == "123"
# v1 = True and False
​
if name == "james" and pwd == "123":
  pass

v2 = "zhangyafei" and "james"
​
# 第一步:将and前后的只转换为布尔值 True and True
# 第二步:判断本次操作取悦于谁?由于前面的是True,所以本次逻辑判断取决于后面的值。
# 所以,后面的只等于多少最终结果就是多少。 v2 = "james"
​
​
v3 = "" and "james"
# 第一步:将and前后的只转换为布尔值 False and True
# 第二步:判断本次操作取悦于谁?由于前面的是False,所以本次逻辑判断取决于前面的值。
# 所以,前面的只等于多少最终结果就是多少。 v2 = ""
​
v4 = 1 or 8 
# 第一步:将and前后的只转换为布尔值 True or True
# 第二步:判断本次操作取悦于谁?由于前面的是True,所以本次逻辑判断取决于前面的值。
# v4 = 1
​
v5 = 0 or 8 
# 第一步:将and前后的只转换为布尔值 False or True
# 第二步:判断本次操作取悦于谁?由于前面的是False,所以本次逻辑判断取决于后面的值。
# v5 = 8
  • 练习题

v1 = 1 or 2
v2 = -1 or 3
v3 = 0 or -1
v4 = 0 or 100
v5 = "" or 10
v6 = "zhangyafei" or ""
v7 = 0 or ""
​
print(v1,v2,v3,v4,v5,v6,v7)
​
# or,看第一个值,如果第一个值为真,结果就应该是第一个值,否则就结果就是第二个值。

v1 = 4 and 8
v2 = 0 and 6
v3 = -1 and 88
v4 = "" and 7
v5 = "张亚飞" and ""
v6 = "" and 0
v7 = 0 and "中国"
​
print(v1,v2,v3,v4,v5,v6,v7)
​
# and,看第一个值,如果第一个值真,结果就应该是第二个值,否则结果就是第一个值。
  • 试题

如果多个and 和or的情况,先计算and再计算or.

v1 = 0 or 4 and 3 or 7 or 9 and 6
     0 or 3 or 7 or 9 and 6
     0 or 3 or 7 or 6
     3 or 7 or 6
     3 or 6
     3
v2 = 8 or 3 and 4 or 2 and 0 or 9 and 7
         8
  
  
v3 = 0 or 2 and 3 and 4 or 6 and 0 or 3
         4

先计算not,在计算and,最后计算or


v4 = not 8 or 3 and 4 or 2

 

 

版权声明:本文为zhangyafei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhangyafei/articles/10107110.html