Python学习-语言基础入门

举报
孙小北 发表于 2020/09/14 22:39:57 2020/09/14
【摘要】 第一章 Python 语言基础 以前只是简单用过Python,近几年Python发展飞速,有种要呈现人人会Python的趋势。正如那句话,人生苦短,我用Python。打算趁着这次课程好好学习一下。感谢华为云AI以及作者OM。 个人博客:www.xiaowangyun.com 华为云博客:本来想写一下第一篇博客,但是发现博客编辑好像没有markdown模式,还需要转换1.1 初探PythonP...

第一章 Python 语言基础

 以前只是简单用过Python,近几年Python发展飞速,有种要呈现人人会Python的趋势。正如那句话,人生苦短,我用Python。打算趁着这次课程好好学习一下。感谢华为云AI以及作者OM。
 个人博客:www.xiaowangyun.com
 华为云博客:本来想写一下第一篇博客,但是发现博客编辑好像没有markdown模式,还需要转换

1.1 初探Python

Python 安装

www.python.org

  • python 3.x

  • python 2.x

IDE  Visual Studia Code

  • VS Code

  • MagicPython(插件)

  • Python(插件)

  • Python for VSCode(插件)

Why Python

 Your life is short. You need Python
  • 工作需要

  • 简单

    • 易学、易读、易于维护

    • 不用关心底层细节、自动内存管理

  • 功能强大:可用于开发系统软件、web、游戏、图像处理、人工智能等,同时具备脚本语言的优点

  • 解释型语言,可移植性、可扩展性、可嵌入性

  • 大公司使用,社区生态圈

Python 特点

  • 解释执行

  • 跨平台

  • 面向对象

  • 动态数据绑定

  • 垃圾自动回收

  • 可扩展性,大量可扩展库

  • 高级特性(函数式编程、迭代器、生成器、闭包、装饰器、元类)

Python与C语言

C语言:源代码-->机器语言-->链接-->可执行文件-->执行

Python: 源代码-->字节码--> 机器语言-->执行(不需要编译成二进制代码)

优势

  • 不用关心程序的编译和库的链接问题,开发人员的工作更加轻松

  • Python代码与机器底层更远,更加容易移植,基本上无需改动就能跨平台运行

缺点

  • Python是解释型语言,运行效率比C语言差。每次运行需先将程序或者语句转换成字节码,然后再由Python虚拟机把字节码转换成机器语言,最后才能在硬件上运行

效率提升

  • 编译成pyc文件,存储了字节码,节省了多次编译动作,减少运行时加载模块的时间。字节码的形式也增加了反向工程的难度,可以保护源码

  • 调用C进行扩展

常用函数

  • dir([obj]) : 显示对象的属性,如果没有提供参数,则显示全局变量的名字,通过执行dir(对象),可以看到其属性和函数信息

  • help()函数

    • help():进入交互式模式,q退出

    • help(对象):直接获取帮助信息

1.2 数据类型

标准数据类型

  • 数字

  • 字符串(str)

  • 列表(list)

  • 元组(tuple)

  • 字典(dict)

  • 集合(set)

其他类型

  • 类型(type)

  • Null对象(None)

  • 函数

  • 模块

  • 文件

标准类型的三种分类方式

  • 存储模型:看对象能保存多少对象(Scalar、Container)

  • 更新模型:对象创建之后是否可以更新值 (invariant、mutable)

  • 访问模型:对象的访问方式 (Direct、Sequential/Random、Mapping)

image-20200914112936621


数字

Python支持的数字类型

  • 整形:1,23,0 ,-1, 0x93,056

  • 长整型:12345678999L,-1982344l(Python3.6版本非法)

  • 布尔型:整形的子类,True和False对应整数的1和0

  • 浮点型:1.23 ,3.14e-10

  • 复数:1 + 2j ,0.23-8.55j

复数的内建属性

  • real: 复数的实部

  • imag:复数的虚部

  • conjugate():返回该复数的共轭复数

数字常量

  • 16进制常量以0x,或者0X开头,0xFF

  • 8进制常量以0o开头,0o777

  • 2进制常量以0b开头,0b10101010

Python整型与C长整型不一样

  • Python的整形的长度远远超过C的长整型

  • 仅与机器的(虚拟)内存的大小有关

  • 长整型要加上大写字母L或者小写字母l,这里建议使用L,小写l容易与数字1混淆

运算符

image-20200914145826045

除法运算

  • 整数除法和浮点数除法已经统一

  • 地板除:Python2.2 引入 “//” ,向下取整

  • 导入__future__中的除法测试,在3.6版本中“未来已经照进了现实”

常用的转换函数

  • int(obj,base = 10):返回字符串或数值对象的整型表示

  • long(obj,base = 10):在3.6版本中已经没有long类型

  • float(obj):返回字符串或数值对象的浮点型表示

  • complex(str) or complex(real, imag=0.0) :返回复数

  • bool(obj):返回布尔值

常用的功能函数

  • abs(num):返回num的绝对值

  • pow(num1,num2,mod=1):取num1的num2次方,如果提供mod参数,则计算结果再对mod进行取余运算

  • round(flt, ndig=0):接受一个浮点型flt并对其进行四舍五入,保存ndig位小数

特别注意以下几个函数的区别

  • int():直接截取小数部分,返回整数

  • round():取与当前值最接近的整数(四舍五入),对浮点数截取精度为0时返回整数,其他返回浮点数

  • math.floor():取与当前数值最接近的,但小于当前数字的整数

 int(-1.2)
 # -1
 round(-1.2)
 # -1
 math.floor(-1.2)
 # -2

与进制相关的函数

  • hex(num):将num转换成十六进制数并以字符串形式返回

  • oct(num):将num转换成八进制数并以字符串形式返回

  • bin(num):将num转换成二进制数并以字符串形式返回

与ASCII转换有关的函数

  • chr(num):将ASCII值的数字转换成ASCII字符,范围只能是0~255

  • ord(chr):接受一个ASCII字符(长度为1的字符串),返回相应的ASCII值

序列类型

序列类型:成员有序排列,可以通过下标偏移量访问一个或多个成员

序列类型的操作符

  • seq[ind]:获得下标为ind的元素

  • seq[ind1:ind2]:获得下标从ind1到ind2之间的元素

  • seq*expr:序列重复expr次

  • seq1+seq2:连接两个序列

  • obj in seq:判断obj是否包含在seq

  • obj not in seq:判断obj是否不包含在seq中

切片操作

  • seq[起始:终止:步长] : 终止代表此位置之前

 alist=[0,1,2,3,4]
 
 alist[0:-1]
 #[0,1,2,3]
 
 alist[0,None]
 #[0,1,2,3,4]
 
 alist[None,None]
 #[0,1,2,3,4]
 
 alist[:]
 #[0,1,2,3,4]
 
 alist[0:-1;2]
 #[0,2]
 
 alist[0:None:2]
 #[0,2,4]
 
 #倒叙,reverse
 alist[::-1]
 #[4,3,2,1,0]

常用功能函数

  • enumerate(iter):接受一个可迭代对象作为参数,返回一个enumerate对象(同时也是一个迭代器),该对象生成有iter每个元素的下标和值组成的元组

  • len(seq):返回seq的长度

  • reversed(seq):返回与seq逆序的迭代器,不是逆序的序列

  • zip(it0,it1,...,itN):返回一个列表,其第一个元素是it0、it1...这些元素的第一个元素组成的一个元组,第二个...依此类推。常用于构造字典

 for index,val in enumerate('abcde'):
   print(index,val)
 #0 a
 #1 b
 #2 c
 #3 d
 #4 e
 
 for val in reversed(astr):
   print(val)
 #e
 #d
 #c
 #b
 #a
 
 alist=[0,1,2,3,4]
 blist=[a,b,c,d,e]
 zip(alist,blist)
 #zip object
 for x,y in zip(alist,blist):
   print(x, y)

字符串

字符串常量有三种表示方法

  • 单引号(‘),如 a='I love Python'

  • 双引号(”),如a="I love Python"

  • 三重引号(“”“),如

     a = """ I love Python
             and Java
         """

注意:

  • Python中单引号和双引号作用相同,在三重引号中可以表示多行字符串

  • Python中没有专门的Char类型,一个字符就是长度为1的字符串

  • Python字符串是不可改变的

  • Python字符串后是没有’\0‘结尾的

在Python中字符串是一个字符的序列。在内存的存放如下图所示:

image-20200914155401229


在Python中字符串下标从0开始,-1表示序列中最后一个值的下,-2表示倒数第二值的下标以此类推。

字符串是序列对象,可以对字符串进行切片。

a[1:3]的值是“yt”。冒号前是切片的起始位置,如果没有值就从字符串的起始位置开始,冒号后是切片的终止位置,如果没有值就是表示到字符串的结尾。

切片的字符串的值就是从起始位置到终止位置减1的字符串。

a[:] 就表示整个字符串。

a[:3]就表示从0开始到2这个位置的字符串,该值为“Pyt”

 astr = ’Python‘
 astr[1]
 #'y'
 astr[5]
 #'n'
 astr[-1]
 #'n'
 astr[-2]
 #'o'
 astr[1:3]
 #'yt'

字符串操作符

  • "+" : 用于字符串的链接操作,字符串也可以使用空格链接

  • ”*“:重复操作符

  • ”==“、”<“、”>“、”!=“:可以进行两个字符串比较

 
 'I'+'Love'+'Python'
 #ILovePython
 
 'I' 'Love' 'Python'
 #ILovePython
 
 'I'*3
 #III
 
 astr = 'Love'
 bstr = 'Hate'
 astr == bstr
 #False

注:出于性能方面的考虑,不推荐使用”+“进行字符串链接。Python 里字符串是不可变的,所以每次longStr +=s 都是将原来的longStr与str拷贝成一个新的字符串,再赋值给longStr。随着longStr的不断增长,所要拷贝的内容越来越长,并且要拷贝N次

 # 假设:shortStrs = [str1,str2,...,strN]
 # 一般拼接字符串
 longStr = ’‘
 for s in shortStrs:
   longStr +=s
 
 # 推荐方式:效率更高,代码更简洁
 longStr = "".join(shortStrs)
  • join函数,可以将一个序列以指定的字符串拼接起来

  • ”[:]“:切片操作符。[开始:终止:步长]

  • ”in“ , ”not in“ :是否为成员测试

字符串格式化

  • %[(name)][flags][width][.precision]typecode % (a, b ,c) :元组、或字典{}

  • 只有一个参数可以省去()

 astr = 'I Love %s and %s' % ('Python', 'Java')
 # I love Python and Java
 
 astr = 'I Love %s' % 'Python'
 # I love Python
 
 bstr = 'I am %(name)s, and I am %(age)d years old' % {'name':'Sunxiaobei','age':23}
 # I am Sunxiaobei, and I am 23 years old
  • 字符串格式化代码

     s 字符串(或任意对象)
     r s,但使用repr,而不是str
     c 字符
     d 十进制(整数)
     i 整数
     u 无符号整型
     o 八进制整数
     x 十六进制整数
     X x,但打印大写
     e 浮点指数
     E e,但打印大写
     f 浮点十进制
     g 浮点e或f
     G 浮点E或F
     % 常量%
  • “r” “R”:原始字符串操作符号。当字符串前有该操作符则输出的字符串就是输入的字符串,不进行相关的转义字符的替换。正则表达式的很多字符串都会用到该操作符已避免不必要的转义字符。

  • “u”“U”:Unicode操作符。可以把该操作符后的字符串转换为Unicode编码的字符串。

 print(r'This is a test of enter. \n')
 # This is a test of enter. \n
 
 print('This is a test of enter. \n')
 # This is a test of enter.
 #
 
 print(R'This is a test of enter. \n')
 # This is a test of enter. \n
 
 
 unicodestr = U'我喜欢Python'
 unicodestr.encode('utf8')
 #b'ASCII编码'
 unicodestr.encode('GBK')
 print(unicodestr)

字符串是不可变的对象,不能对字符串的单个元素赋值,或者对字符串的切片赋值。

 astr = 'I Love Python'
 astr[0]='U'
 # 会报错

上述例子,我们可以看到字符串被改变了。其实这不是字符串改变了,而是我们把原有的字符串“I love pyton.”释放了,重新创建了一个字符串,并赋了新的值。我们可以通过id()函数来发现这个问题。id()函数返回对象的实例号。

 astr = 'I Love Python'
 id(astr)
 #4645214633
 
 astr += ' and Java'
 id(astr)
 #4645258625
 
 print(astr)
 #I Love Python and Java

我们可以很清楚的看到,实例号发生了改变,这个a是新创建出来的字符串。

对于不可改变的对象,象字符串,在赋值时作为左值的表达式必须是完整的对象。否则就会引发异常。就象我们前面举的给字符串的切片赋值的例子。

  • cmp(str1,str2):根据字符串的ASCII码值进行比较(python 3.6没有cmp)

  • max()和min():按照ASCII码值返回最大或最小的字符

 astr = 'abc'
 max(astr)
 #c
 min(astr)
 #a

扩展阅读

Unicode

  • 字符串的编码和解码s.encode('utf8'),s.decode()

  • Unicode三明治:decode-->process-->encode

  • bytes和bytearray


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。