Python入门(上)

天池Python训练营学习平台
配套电子书
训练营证书获取

一、引言

  本人精通Python语言开发,开发涉及范围为安全检测、爬虫等方面的Python程序开发,主要使用的第三方库为Pandas,但在AI方面的Python开发基本为零,此前学习Python语言主要看了两本书《Python学习手册》和《流畅的Python》,《Python学习手册》适合入门且希望对Python能进一步深耕的同学,打牢基础,Python基本入门确实非常简单,有一定经验的其它语言使用者几乎一两小时即能上手Python语言开发,但对Python的设计理念和细节的忽视往往容易造成灾难性的bug,例如==和is对不同数据类型的判断。
  Python属于大龄转码后自学了点基础语法便从事了相关开发工作,目前遇到一定的瓶颈,Python基础功底还有所欠缺,纯Python开发的岗位其实很少,现阶段招聘需求多为机器学习等AI的应用方向。

二、变量、运算符与数据类型

  变量、运算符与数据类型为Python的基础语法,介绍了Python语言的基本语法要素。

1. 变量

  变量:是数据的标志符,是数据的名称,变量使用前需先赋值,使其对应具体的数据,变量名称可以包括字母、数字、下划线但开头不能为数字,切记在Python中变量名是大小写敏感的。

2. 运算符

  运算符:用于各种数据类型之间的运算,和数学中的运算符是基本一致的,包括算术运算符、比较运算符、逻辑运算符和位运算符,同时遵守相应的运算符优先级,同时还包括判断是否一致或存在的其它运算符,例如in和is。举例介绍下位运算符,顾名思义是从比特位的角度进行的运算操作。

print(~4)  # -5

  对4取反结果为-5,为什么?整数4占一个字节8位,正数,补码为自身00000100,取反后为11111011,首位为1表示负数,负数的补码为反码+1,故补码11111011对应的原码为10000101,表示负数-5。
  算术运算符:
在这里插入图片描述
  比较运算符:
在这里插入图片描述
  逻辑运算符:
在这里插入图片描述
  位运算符:
在这里插入图片描述
  其它运算符:
在这里插入图片描述
  需注意的是in和is的差异对比:

  • is, is not 对比的是两个变量的内存地址。
  • ==, != 对比的是两个变量的值。
  • 比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。
  • 对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的。

  运算符优先级:
在这里插入图片描述

3. 数据类型

  数据类型:定义了数据的类别,例如数字类型(整型、浮点型和布尔型,Python中还提供了复数类型)、容器类型(字符串、元组、列表、字典和集合),部分数据类型是可以相互转换的,例如整型到浮点型。

4. 注释

  注释:为Python代码添加解释说明,#表示注释,作用于单行,‘’’ ‘’’ 或者 “”" “”" 表示区间注释,在三引号之间的所有内容为注释内容。

5. 输出函数

  输出函数(print):将程序运行结果输出到终端的函数

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

 - 将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按str()方式进行转换为字符串输出;
 - 关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;
 - 关键字参数end是输出结束时的字符,默认是换行符\n;
 - 关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件;
 - 关键字参数flush是立即把内容输出到流文件,不作缓存.

三、位运算

  比特级的运算,二进制层面的操作与运算,直接对整数在内存中的二进制位进行操作。

1. 原码、反码和补码

  计算机中最基础概念,原码就是二进制本身(首位为符号位),反码就是原码非符号位按位取反,补码分正数和负数,正数补码为原码本身,负数补码为其反码+1,为什么有三种码,主要是为了实现二进制的正确运算,详细请参阅计算机组成原理相关书籍。
  但需要非常注意的是,在Python中负数的二进制表示输出并不是补码,而是原码+负号,有C语言等开发经验的同学一定要注意,例如bin(-6)的结果是’-0b110’,其它语言过来的同学可能会觉得巨坑,但个人理解这确实让Python语言更加接近我们自然语言,本人有过汇编、c/c++、MATLAB等语言经验,但Python理解确实更为直观和解决我们常识认知。

2. 按位运算

  在前述运算符中举例了一个位运算取反,按位运算的运算操作有:

  • 按位非操作( ~)—— 取反
  • 按位于操作(&)—— 两个为1才为1
  • 按位或操作(|)—— 有一个为1就为1
  • 按位异或(^)—— 不相同为1,异或操作的性质:满足交换律和结合律
  • 按位左移(<<)—— 二进制位向左移动
  • 按位右移(>>)—— 二进制位向右移动

3. 基于位运算的快速计算

  位运算虽然相比普通的四则运算虽然理解难度大一些,且调式不如普通运算直接,但位运算由于直接是对内存中的二进制进行操作,故对程序的性能提升非常大。

(1)快速乘除2

  左移1位为乘以2,右移1位为除以2。

(2)快速交换两个整数

a ^= b
b ^= a
a ^= b

  证明理解如下:

为了简要区分交换前后的a,b,使用a’和b’表示交换后的a,b

  1. 第一步a ^= b,新a = a ^ b, 代入第二步中
  2. b’ = b ^ a = b ^ (a ^ b),使用交换律和结合律, b’ = a ^ (b ^ b) = a ^ 0 = a
  3. 同理代入第三步:a’ = (a ^ b) ^ b’ = a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
      

(3)快速获取最后为1位置的整数

  如何获取一个数最后为1的位置,通过与其相反数做与获取。

a & (-a)

  证明如下:

  1. 假定a为正数(若为负数时,则交换位置为(-a) & a,第一个数为正数,故不需分类考虑)
  2. a为正数,则a的补码为原码本身,-a则为a的反码+1,a & (-a)为与运算,两个为1才为1
  3. 对于a来说,最后一个为1的位置,取反后,对应其位置为0,而其它位置均为1,反码+1为补码,故最后一个位置处变为1,与只有两个为1才为1,故得出的结果为最后为1位置的整数。

(4)利用位运算实现整数集合

  一个数的二进制表示可以看作是一个集合(0表示不在集合中,1表示在集合中),例如对于集合{1, 3, 4, 8},表示第8位、4位、3位、1位的集合存在则为1,其它位0,注意二进制高位在前,故对应的二进制表示为(0100011010),此时位运算的操作就相当于集合的插入删除等操作。

a = 0b0100011010
a | (1<<i)  -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 从集合中删除
a & (1<<i)  -> 判断 i 是否属于该集合(零不属于,非零属于)
a 补   -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)

四、条件语句

  分支判断与选择语句,满足条件,核心是if语句,其它都是围绕If的变型和组合使用。
  单if情况:

if 2 > 1 and not 2 > 3:
    print('Correct Judgement!')

  单if和else组合情况:

temp = input("猜一猜小姐姐想的是哪个数字?")
guess = int(temp) # input 函数将接收的任何数据类型都默认为 str。
if guess == 666:
    print("你太了解小姐姐的心思了!")
    print("哼,猜对也没有奖励!")
else:
    print("猜错了,小姐姐现在心里想的是666!")
print("游戏结束,不玩儿啦!")

  多选择if情况:

temp = input('请输入成绩:')
source = int(temp)
if 100 >= source >= 90:
    print('A')
elif 90 > source >= 80:
    print('B')
elif 80 > source >= 60:
    print('C')
elif 60 > source >= 0:
    print('D')
else:
    print('输入错误!')

  assert断言关键词,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssertionError的异常。

五、循环语句

  循环语句用于循环执行多次的场景。

1.基本循环:while和for

  当while后面的条件表达式为真时永久执行循环体,for循环是迭代循环,可以遍历任何有序和任何可迭代的对象。while和for的差异可以理解为while是在一定条件下,for是在一定范围限制内的循环。

2.进阶循环:while和for+else

  一般的,while和for循环当条件为真时执行循环体。自然而然的,也存在当条件为真时执行循环体,不为真时执行另一种动作:这就是while - else和for-else循环。
  while-else循环:当while循环正常执行完的情况下,执行else输出,如果while循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容。
  for - else 循环:当for循环正常执行完的情况下,执行else输出,如果for循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容,与while - else语句一样。

3.循环中控制语句

  • break语句:可以跳出当前所在层的循环。
  • continue语句:终止本轮循环并开始下一轮循环。
  • pass语句:你在需要有语句的地方不写任何语句,那么解释器会提示出错,而 pass 语句就是用来解决这些问题的,指不做任何操作,空语句,理解为占位符,为将来扩展预留空间。

4.提升代码简洁和可读性的循环函数

  range()函数:按照指定的起始和间隔长度进行迭代。

range([start,] stop[, step=1])
 - 这个BIF(Built-in functions)有三个参数,其中用中括号括起来的两个表示这两个参数是可选的。
 - step=1 表示第三个参数的默认值是1- range 这个BIF的作用是生成一个从start参数的值开始到stop参数的值结束的数字序列,该序列包含start的值但不包含stop的值。

  使用list将range结果序列化:

>>> list(range(1,10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

  enumerate()函数:这是一个非常好的函数,当需要遍历每个元素,又需要使用该元素的索引位置时非常有用,能够直接返回每个元素的位置,当然,可以直接使用索引依次遍历,但这样了的话,就不是Python了。


>>> languages = ['Python', 'R', 'Matlab', 'C++']
>>> for i, language in enumerate(languages, 2):
...     print(i, 'I love', language)
... 
2 I love Python
3 I love R
4 I love Matlab
5 I love C++

5.循环进阶神器:推导式

  什么是推导式,即将一些循环操作直接嵌入到列表、集合或者字典中,而不是依次赋值的方式,能够有效提升程序时间性能(具体底层逻辑没有研究和调研过,但实际测试确实如此)。
  列表推导式:[ expr for value in collection [if condition] ]
  元组推导式:( expr for value in collection [if condition] )
  集合推导式:{ expr for value in collection [if condition] }
  字典推导式:{ key_expr: value_expr for value in collection [if condition] }

>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (i for i in range(10))
<generator object <genexpr> at 0x7fc8136e00b0>
>>> tuple(i for i in range(10))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> {i for i in range(10)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> {i:i%2==0 for i in range(10)}
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}

六、异常处理

  异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。

1.异常语句

  Python中异常处理使用try-except语句,进阶使用try-except-finally以及try-except-else。

try:
    检测范围
except Exception[as reason]:
    出现异常后的处理代码
  
try 语句按照如下方式工作:
 - 首先,执行try子句(在关键字try和关键字except之间的语句)。
 - 如果没有异常发生,忽略except子句,try子句执行后结束。
 - 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try - except语句之后的代码。
 - 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。

  try - except - finally 语句是在try-except语句基础上,无论是否异常都要执行的代码。
  try - except - else语句是在try-except语句基础上, 如果没有异常则执行else后的这块代码
  raise:抛出自定义错误内容的指定异常。


>>> try:
...     raise NameError('HiThere')
... except NameError:
...     print('An exception flew by!')
... 
An exception flew by!

 &emsp;Google 开源项目风格指南中允许使用异常但强调谨慎使用,不可滥用,可能会导致控制流晦涩难懂. 调用库函数时容易忘记处理异常。
  训练营总结了Python标准异常和标准告警(深表感谢,个人之前确实在万不得已不会使用异常语句):

2.Python 标准异常总结

  • BaseException:所有异常的 基类 Exception:常规异常的 基类 StandardError:所有的内建标准异常的基类
  • ArithmeticError:所有数值计算异常的基类 FloatingPointError:浮点计算异常
  • OverflowError:数值运算超出最大限制 ZeroDivisionError:除数为零
  • AssertionError:断言语句(assert)失败 AttributeError:尝试访问未知的对象属性
  • EOFError:没有内建输入,到达EOF标记 EnvironmentError:操作系统异常的基类 IOError:输入/输出操作失败
  • OSError:操作系统产生的异常(例如打开一个不存在的文件) WindowsError:系统调用失败
  • ImportError:导入模块失败的时候 KeyboardInterrupt:用户中断执行 LookupError:无效数据查询的基类
  • IndexError:索引超出序列的范围 KeyError:字典中查找一个不存在的关键字
  • MemoryError:内存溢出(可通过删除对象释放内存) NameError:尝试访问一个不存在的变量
  • UnboundLocalError:访问未初始化的本地变量 ReferenceError:弱引用试图访问已经垃圾回收了的对象
  • RuntimeError:一般的运行时异常 NotImplementedError:尚未实现的方法
  • SyntaxError:语法错误导致的异常 IndentationError:缩进错误导致的异常 TabError:Tab和空格混
  • SystemError:一般的解释器系统异常 TypeError:不同类型间的无效操作 ValueError:传入无效的参数
  • UnicodeError:Unicode相关的异常 UnicodeDecodeError:Unicode解码时的异常
  • UnicodeEncodeError:Unicode编码错误导致的异常
  • UnicodeTranslateError:Unicode转换错误导致的异常

3.异常内部关系

  异常体系内部有层次关系,Python异常体系中的部分关系如下所示:
在这里插入图片描述

4.Python标准警告总结

Warning:警告的基类
DeprecationWarning:关于被弃用的特征的警告
FutureWarning:关于构造将来语义会有改变的警告
UserWarning:用户代码生成的警告
PendingDeprecationWarning:关于特性将会被废弃的警告
RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
SyntaxWarning:可疑语法的警告
ImportWarning:用于在导入模块过程中触发的警告
UnicodeWarning:与Unicode相关的警告
BytesWarning:与字节或字节码相关的警告
ResourceWarning:与资源使用相关的警告

七、总结

  Python入门(上)部分主要是Python的基本语法要素:包括变量和数据类型、运算操作、语句(条件和循环)等基本的概念,这和其它编程语言并没有本质的区别,大多只是具体的编程实现细节的差异,若有其它编程语言的经历,一定要认识到Python与之的差异,务将其它语言的习惯代入到Python中,否则便不是Python了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raykingl

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值