【Python】--- 基础语法(1)
目录
- 1.变量和表达式
- 2.变量和类型
- 2.1变量是什么
- 2.2变量的语法
- 2.3变量的类型
- 2.3.1整数
- 2.3.2浮点数(小数)
- 2.3.3字符串
- 2.3.4布尔
- 2.3.5其他
- 2.4为什么要有这么多类型
- 2.5动态类型特征
- 3.注释
- 3.1注释的语法
- 3.2注释的规范
- 结语
1.变量和表达式
对python
的学习就从以下一段代码开始吧。我们可以把python
当成一个计算器,来进行一些算数运算,如下:
print(1 + 2 - 3) #0
print(1 + 2 * 3) #7
print(1 + 2 / 3) #1.6666666666666665
注意:
print
是一个python
的内置的函数,这个后面会讲解;- 可以使用
+ - * /
等运算符进行算术运算。且先算乘除,后算加减; - 运算符和数字之间,可以没有空格,也可以有多个空格。但我们一般习惯上会写一个空格(比较美观,可读性高)。
通过上面的代码我们发现,在python
中,2 / 3 = 0.6666666666666666
而不是0
!!这一点我们可以对比C / Java
,在这些语言中整数除以整数的结果还是整数!并且会把小数部分直接舍弃(截断)!
观察三式的结果,问题又来了,根据一般的数学运算,为什么结果小数的末尾是6665
而不是6667
呢?这是因为在编程中,一般没有“四舍五入”这样的规则。 在python
中,形如1.666...665
这样的小数被称为浮点数 ,且python
遵循IEEE754
标准~这套规则下,在内存中表示浮点数的时候,可能存在微小的误差,这就造成了1.666...665
这样的结果。
在print(1 + 2 / 3)
中,形如1+ 2 / 3
被称为表达式,这个表达式的结果被称为表达式的返回值,1, 2, 3
这样的数字,称为字面量,+ / *
这样的符号被称为运算符/操作符。
2.变量和类型
2.1变量是什么
有的时候,我们需要进行的计算可能更复杂一些,需要把一些计算的中间结果保存起来。这个时候就需要用到变量,例如下面这个题目:
例题1:给定四个分数,
67.4, 88.5, 90, 76.7
,编写代码,求这四个数的方差。
在这个代码中,就需要先计算这四个数的平均值,然后再计算方差。那么为了方便计算方差,这就需要我们把计算得到的平均值使用变量保存起来,代码如下:
avg = (67.4 + 88.5 + 90.0 + 76.7) / 4 #计算平均值,并用变量avg保存
total = (67.4 - avg) ** 2 + (88.5 - avg) ** 2 + (90.0 - avg) ** 2 + (76.7 - avg) ** 2
result = total / 4
print(result)
注意:
avg, total, result
均为变量,我们也可以创建任意多的变量,来随心所欲的保存很多很多的数据;**
在python
中表示乘方运算,** 2
即为求平方。
变量可以视为是一块能够容纳数据的空间,这个空间往往对应到“内存”这样的硬件设备上,具体了解还请学习计算机组成原理。
打个比方,我们可以把内存想象成一个宿舍楼,这个宿舍楼上有很多的房间,每个房间都可以存放数据。
衡量内存的一个重要指标就是内存空间的大小。 比如我的电脑内存是16GB,这个数字越大,意味着内存的存储空间就越大,能够存放的数据(变量)就越多。
2.2变量的语法
创建变量的语句非常简单,如下:
num = 10
其中num
为变量名。当我们创建很多个变量的时候, 就可以用名字来进行区分。=
为赋值运算符, 表示把 =
右侧的数据放到 =
左侧的空间中,与数学上的比较相等区分。
注意: 变量在命名时要注意一定的规则:
硬性规则,必须遵守!!
- 变量名必须由数字,字母,下划线构成~不能包含特殊字符;
- 数字不能开头;
- 变量名不能和
python
的“关键字”重复,“关键字”为在语法中有特殊含义的单词,如if
,print
等; python
中的变量名是大小写敏感的,因此要区分大小写。如num
和Num
是两个不同的变量名。
软性规则,建议遵守!!
- 给变量命名的时候,尽量使用描述性的单词来表示,尽量通过名字来表现出变量的作用。如在描述身高时用
height
,描述体重时用weight
,用count
来计数…; - 当包含多个单词时,命名规则可以有多种规范,
- 驼峰命名: 除了第一个单词的首字母外,后面每个单词的首字母都大写。如
personInfo
,pushBack
; - 蛇形命名: 单词之间,使用下划线
_
来进行分隔。如person_info
,push_back
。
- 驼峰命名: 除了第一个单词的首字母外,后面每个单词的首字母都大写。如
数学上,变量通常使用 x, y, z 这种简单的英文字母或者拉丁字母表示。但是在编程中不建议这样使用。
原因是编程中,一个程序里通常会同时创建出很多个变量。如果只是使用单个字母表示,在变量多了的时候, 就很难记住哪个变量是干啥的,从而给维护程序带来了一定的困难。因此我们更建议使用带有明确描述性的名字,来表示变量的用途。
再来看下面这一段代码:
a = 10 #(1)处
b = a
print(b)
a = 20 #(2)处
print(a)
上面这段代码,(1)
处首次使用'='
对a
进行设置值,这个过程是在创建变量(初始化)。(2)
处再对a
使用'='
操作,则是相当于修改a
的内容(赋值)。
2.3变量的类型
变量里面存储的不仅仅是数字,还可以存储其它种类的数据。为了区分不同种类的数据,我们引入了 “类型” 这样的概念。
注意: 和 C++ / Java
等语言不同,Python
变量的类型不需要显式指定,而是依靠初始化语句,根据初始化的值的类型来进行确定的。
2.3.1整数
num = 10
print(type(num)) # => <class 'int'>
type
和python
内置的函数。可以使用type
来查看一个变量的类型。
注意: 在Python
中,int
能够表示的数据范围,是无穷的。Python
中int
是可以根据要表示的数据大小自动扩容的~。因此Python
这里就没有long
,short
这样的类型了。反观C++ / Java
中的int
只能表示大概-21~21
亿。
2.3.2浮点数(小数)
num = 0.5
print(type(num)) # => <class 'float'>
注意: 和 C++ / Java
等语言不同,Python
的小数只有 float
一种类型,没有double
类型。但是实际上Python
的 float
就相当于 C++ / Java
的 double
,表示双精度浮点数。所以Python
中float
占8字节空间,通常把一个二进制位称为1 bit
,8 bit
放在一起就称为一字节(byte
)。
PS: 关于单精度浮点数和双精度浮点数的问题, 我们此处不做过多讨论。大家只要知道,相比于单精度浮点数(4字节),双精度浮点数占用的内存空间更多(8字节),同时表示的数据精度更高即可(大概精确到小数点后15 位)。
2.3.3字符串
arr = 'hello'
print(type(arr)) # => <class 'str'>
字符串 是把一个个字符放到一起。所谓字符可以认为是英文字母,阿拉伯数字,标点符号,甚至汉字符号,如'8'
,'a'
,'+'
。然后使用 ' '
或者 " "
将字符引起来的,就称为字符串。可以用来表示文本。
注意: 在 Python
中,单引号构成的字符串和双引号构成的字符串,没有区别。'hello'
和"hello"
是完全等价的。
思考这样一个问题:如何用字符串将My name is "ZhangSan"
,表示出来?
sentence = "My name is 'ZhangSan'" #sentence = "My name is "ZhangSan"" 是否可以?
对于上面这个问题,显然是不可以的。因此,如果字符串里面包含了双引号,表示字符串就可以用单引号引起来;反之,如果包含了单引号,那么便可以用双引号来引字符串。
如果句子中同时有单,双引号呢?这时Python
还有一种字符串,使用三引号表示'''string'''
或"""string"""
。
a1 = "hello"
a2 = "world"
print(a1 + a2) # 打印 => "helloworld"
上述这段代码就是字符串拼接,也就是把后面的字符串拼接到前一个字符串的末尾,从而得到一个更大的字符串(对于原字符串a1
,a2
是无影响的)! 且我们不可以将字符串和数字混合相加! 字符串作为开发中最常用到的数据类型,支持的操作方式也是非常丰富的,这里就暂且不介绍了。
从结果也可以看出编译器报错了,还想介绍的一个点是,在Python
中报错有两种情况:
- 语法错误: 在程序运行之前,
Python
解释器就能把错误识别出来; - 运行错误: 在程序运行之前,
Python
解释器识别不了,必须要执行到对应的代码,才能发现问题。
2.3.4布尔
布尔类型是一个特殊的类型,取值只有两种,True
(真) 和 False
(假)。着重要注意首字母大写!
a = True #或 a = False
print(type(a)) # => <class 'bool'>
布尔类型在后续进行逻辑判断的时候,是非常有用的。
2.3.5其他
除了上述类型之外,Python
中还有 list
(列表),tuple
(元组),dict
(字典),自定义类型 等等。我们后续再介绍。
2.4为什么要有这么多类型
- 不同的类型,占用的内存空间是不同的。
例如:int
在内存中默认占据4字节,但可以动态扩容;float
类型固定占8字节;bool
类型只占用1字节。
PS:计算机里面使用二进制来表示数据。也就是每个位只能表示
0
或者1
。1 个二进制位,就称为是一个 “比特”,8 个二进制位,就称为一个 “字节” (Byte
)一个float
变量在内存中占据 8 个字节空间,也就是 64个二进制位。我的电脑有16GB
的内存空间,也就是一共有1024 * 1024 * 1024 * 8
这么多的二进制位。
- 不同的类型,对应能够进行的操作也是不同的。
例如:int / float
类型的变量,可以进行+ - * /
等操作,而str
类型的变量,只能进行+
(并且操作是字符串拼接),不能进行- * /
,但是还能使用len
等其他操作。
总结: 类型系统其实是在对变量进行 “归类”。相同类型的变量(数据) 往往具有类似的特性和使用规则。
2.5动态类型特征
在程序运行过程中,变量的类型可能发生改变,这种称为动态类型,看如下代码:
a = 10
print(type(a)) # => <class 'int'>
a = "Hello"
print(type(a)) # => <class 'str'>
a = True
print(type(a)) # => <class 'bool'>
在程序执行过程中,a
的类型刚开始是 int
,后面变成了 str
,最后又变成了bool
。
C++/Java
这样的语言则不允许这样的操作。一个变量定义后类型就是固定的了。这种特性则称为静态类型。如在c++ / Java
中定义int a = 10;
,那么如果后面再对a
进行修改(a = "Hello"
),程序就会报错。
一个编程语言是否是动态类型,只是取决于运行时类型是否发生改变,不取决于变量定义的时候是否声明类型!
动态类型特性是一把双刃剑:
- 对于中小型程序,可以大大的节约代码量(比如写一段代码就可以同时支持多种类型)。
- 对于大型程序,则提高了模块之间的交互成本。(程序猿 A 提供的代码难以被 B 理解)。
PS:因此很多公司,在创业之初,喜欢用
Python
来开发,(产品规模小,一两个程序猿很快就能写出来),但是当项目达到一定的规模之后,动态类型的劣势就逐渐体现了,很多公司就会针对之前Python
写的代码使用其他语言进行重构~
3.注释
注释是一种特殊的代码,它不会影响到程序的执行,但是能够起到解释说明的作用,能够帮助程序猿理解程序代码的执行逻辑。
PS:写代码是一件比较烧脑的事情,读代码同样也非常烧脑。相比于一板一眼的代码,一些口语化的描述能更好的帮助程序猿理解程序。代码的第一目标是容易理解,第二目标才是执行正确。 写注释不光是为了方便别人来理解,也是方便很久之后的自己理解。
3.1注释的语法
Python
中一般有两种注释风格:
- 注释行:
使用#
开头的行都是注释,如下:
# 注释的内容
- 文档字符串:
使用三引号引起来的称为 “文档字符串”,也可以视为是一种注释。(1). 可以包含多行内容;(2). 一般放在 文件/函数/类 的开头;(3)."""
或者'''
均可 (等价)。 如下:
"""
文档字符串
文档字符串
"""
3.2注释的规范
- 内容准确: 注释内容要和代码一致,匹配,并在代码修改时及时更新。
- 篇幅合理: 注释既不应该太精简, 也不应该长篇大论。
- 使用中文: 一般中国公司都要求使用中文写注释,外企另当别论。
- 积极向上: 注释中不要包含负能量。
结语
最近一段时间也是学习了Python
的一些基础语法和代码案例,在这也会更新一段时间Python
,作为自己的学习记录。如果出现什么错误的地方还请各位大佬指出^ _ ^ 。
Python
的很多特色与他的设计哲学息息相关:解决一个问题,只提供一种方案~
相关文章:

【Python】--- 基础语法(1)
目录 1.变量和表达式2.变量和类型2.1变量是什么2.2变量的语法2.3变量的类型2.3.1整数2.3.2浮点数(小数)2.3.3字符串2.3.4布尔2.3.5其他 2.4为什么要有这么多类型2.5动态类型特征 3.注释3.1注释的语法3.2注释的规范 结语 1.变量和表达式 对python的学习就…...
详解gorm中DB对象的clone属性
详解gorm中DB对象的clone属性 Gorm 版本:v1.22.4 Where函数源码 // Where add conditions func (db *DB) Where(query interface{}, args ...interface{}) (tx *DB) {tx db.getInstance()if conds : tx.Statement.BuildCondition(query, args...); len(conds) &…...

数据库(MySQL库表操作)
目录 1.1 SQL语句基础(SQL命令) 1.1.1 SQL的简介 1.1.2 SQL语句的分类 1.1.3 SQL语句的书写规范 1.2 数据库操作 1.2.1 查看 1.2.2 自建库 1.2.3 切换数据库 1.2.4 删库 1.3 MySQL字符集 1.3.1 MySQL字符集包括: 1.3.2 utf8 和 u…...

内网穿透的应用-如何使用Docker部署Redis数据库并结合内网穿透工具实现公网远程访问
文章目录 前言1. 安装Docker步骤2. 使用docker拉取redis镜像3. 启动redis容器4. 本地连接测试4.1 安装redis图形化界面工具4.2 使用RDM连接测试 5. 公网远程访问本地redis5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Ub…...
计算机网络复试
第1章 概述 时延:发送(传输)时延传播时延 链路中每多一个路由器,就增加一个分组的发送时延 第2章 物理层 2.4 编码与调制->编码(基带调制)->曼彻斯特编码 ->带通调制->混合调制->正交振幅调制QAM 信道极限容量 奈氏准则 无噪声最大速…...

Android学习之路(23)组件化框架ARouter的使用
一、功能介绍 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中支持多模块工程使用支持添加多个拦截器,自定义拦截顺序支持依赖注入,可单独作为依赖注入框架使用支持InstantRun支持MultiDex(Google方案)映射关系按组分类、多级管理&…...

HCIA vlan练习
目录 实验拓扑 实验要求 实验步骤 1、交换机创建vlan 2、交换机上的各个接口划分到对应vlan中 3、trunk干道 4、路由器单臂路由 5、路由器DHCP设置 实验测试 华为交换机更换端口连接模式报错处理 实验拓扑 实验要求 根据图划分vlan,并通过DHCP给主机下发…...

Ubuntu下安装Gazebo仿真器
Ubuntu下安装Gazebo仿真器 Gazebo仿真平台通常需要配合ROS使用,因此需要先安装ROS。可以参考ROS安装教程 首先安装一些必要的工具 sudo apt-get update sudo apt-get install lsb-release wget gnupg修改源 sudo wget https://packages.osrfoundation.org/gazebo…...

Chatgpt+Comfyui绘图源码说明及本地部署文档
其他文档地址: ChatgptComfyui绘图源码运营文档 ChatgptComfyui绘图源码线上部署文档 一、源码说明 1、源码目录说明 app_home:app官网源码chatgpt-java:管理后台服务端源码、用户端的服务端源码chatgpt-pc:电脑网页前端源码cha…...
ts中 any 和 unknown 有什么区别,分别什么时候使用
any 和 unknown 都是顶级类型 top type,也就是所有类型的父类型 (1)any代表任意类型, 是不做任何检查,相当于不使用 ts,不建议使用,使用 a as any as string 之类的,可以让类型检查…...

C++中命名空间、缺省参数、函数重载
目录 1.命名空间 2.缺省参数 3.函数重载 1.命名空间 在C中定义命名空间我们需要用到namespace关键字,后面跟上命名空间的名字,结构框架有点类似结构体(如图所示) 上面的代码我一一进行讲解: 1.我们先来说第三行和main函…...
【笔记】Helm-3 主题-12 Helm插件指南
Helm插件指南 Helm插件是一个可以通过helm CLI访问的工具,但不是Helm的内置代码。 已有插件可以搜索GitHub。 https://github.com/search?qtopic%3Ahelm-plugin&typeRepositories 该指南描述如何使用和创建插件。 概述 Helm插件是与Helm无缝集成的附加工具…...

2023.1.17 关于 Redis 持久化 AOF 策略详解
目录 引言 AOF 策略 实例演示一 缓冲区 重写机制 手动触发 自动触发 AOF 重写流程 实例演示二 引言 Redis 实现持久化的两大策略 RDB ——> Redis DataBase(定期备份)AOF ——> Append Only File(实时备份) 注意&…...

P2PNet推理和训练
0、环境信息 Package Version ------------------------ ------------ certifi 2023.11.17 charset-normalizer 3.3.2 contourpy 1.2.0 cycler 0.12.1 easydict 1.11 filelock …...

pyexecjs原生js加密算法逆向
查看必要参数,得知sign签名 从堆栈自上到下依次查找源代码 如下图,找到后打上断点,得知e是输入的参数,说明b()是一个加密函数,点击进入查看底层函数 把1117这个函数内的三个方法CV到python中的一个js文件中,…...

数据结构Java版(4)——链表
一、概述 链表是一种常见的数据结构,用于存储一系列具有相同类型的数据元素。它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。 链表与数组不同,它的节点在内存中不是连续存储的,而是通过每个节点中的指针…...
cfssl简单使用
1、安装 方式1:直接下载 详见:手动生成证书 | Kubernetes # 1、下载cfssl、cfssljson、cfssl-certinfo # cfssl:用于签发证书 # cfssljson:将cfssl签发生成的证书(json格式)变成文件承载式文件 # cfssl-certinfo:验…...

基于Word2vec词聚类的关键词实现
一.基于Word2vec词聚类的关键词步骤 基于Word2Vec的词聚类关键词提取包括以下步骤: 1.准备文本数据:收集或准备文本数据,可以是单一文档或文档集合,涵盖关键词提取的领域。2.文本预处理:清洗文本数据,去除…...

开源项目_大模型应用_Chat2DB
1 基本信息 项目地址:https://github.com/chat2db/Chat2DBStar:10.7K 2 功能 Chat2DB 是一个智能且多功能的 SQL 客户端和报表工具,适用于各种数据库。 对于那些平时会用到数据库,但又不是数据库专家的程序员来说,…...
【线性代数与矩阵论】范数理论
范数理论 2023年11月16日 文章目录 范数理论1. 向量的范数2. 常用向量范数3. 向量范数的等价性4. 矩阵的范数5. 常用的矩阵范数6. 矩阵范数与向量范数的相容性7. 矩阵范数诱导的向量范数8. 由向量范数诱导的矩阵范数9. 矩阵范数的酉不变性10. 矩阵范数的等价性11. 长方阵的范数…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...