< 返回索引页html
<!-- /TOC -->windows
从本章开始,咱们开始学习Python的基本语法。api
在上一章,咱们python环境已经安装完毕,也选择好了合适本身的编辑器,如今咱们开始进入python的编程世界。数组
让咱们来看一个python的简单程序,HelloWorld
。安全
解释器运行
打开系统终端输入python
,启动python解释器,录入以下代码,回车观察返回值。
$ python3 Python 3.6.5 (default, Mar 30 2018, 06:42:10) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> print('Hello world!')
代码返回以下:
Hello world!
下面咱们来解释下这段代码:
>>>
python的交互环境的提示符print
python 内置的打印方法,它会打印括号中的字符串。代码文件运行
咱们能够把以上代码保存成python的脚本文件,并保存为hello.py
, python的代码文件是以py
做为扩展名的。下面咱们来执行它,在咱们的系统终端执行以下命令:
$python hello.py
代码返回以下:
Hello world! 你好,世界!
到这,咱们知道了如何在python 解释器和代码文件中运行代码。
定义
咱们在编写代码的时候,每每须要添加一些说明以帮助咱们来理解代码逻辑,在代码执行的时候,这些说明不会被执行。这些说明叫作注释
。Python中的注释,使用井号、单引号或双引号标识,以下:
# 单行注释 ''' 我是多行注释 我是多行注释 ''' """ 我是多行注释 我是多行注释 """
注释经常使用场景
程序设计中,预留了一些标识符号供语言自己或系统使用,这些标识符被称为关键字
。每一个关键字都有本身的含义,在python中可经过如下方式查看关键字:
>>> import keyword >>> keyword.kwlist ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
咱们能够经过以下方法判断字符串是否为关键字:
>>> keyword.iskeyword('and') True >>> keyword.iskeyword('have') False
关键字不可做为变量的名称使用。
变量中储存数据的类型能够是多种多样的,咱们把变量中存储数据的类型叫数据类型
。而python 中经常使用的数据类型,有这么几种:
整型(int)
: Python3中能够处理任意大小的整数(Python 2.x中有int和long两种类型的整数,但这种区分对Python来讲意义不大,在python中内存分配是自动的,用户并不关心这些细节,反而给用户无限大的使用空间更好,所以在Python 3.x中整数只有int这一种了),并且支持二进制(如0b100,换算成十进制是4)、八进制(如0o100,换算成十进制是64)、十进制(100)和十六进制(0x100,换算成十进制是256)的表示法。复数型(complex)
:形如3+5j,跟数学上的复数表示同样,惟一不一样的是虚部的i换成了j。浮点型(float)
:浮点数也就是小数,之因此称为浮点数,是由于按照科学记数法表示时,一个浮点数的小数点位置是可变的,浮点数除了数学写法(如123.456)以外还支持科学计数法(如1.23456e2)。字符串型(str)
:字符串是以单引号或双引号括起来的任意文本,好比'hello'和"hello",字符串还有原始字符串表示法、字节字符串表示法、Unicode字符串表示法,并且能够书写成多行的形式(用三个单引号或三个双引号开头,三个单引号或三个双引号结尾)。布尔型(bool)
:布尔值只有True、False两种值,要么是True,要么是False,在Python中,能够直接用True、False表示布尔值(请注意大小写),也能够经过布尔运算计算出来(例如3 < 5会产生布尔值True,而2 == 1会产生布尔值False)。python中把None、0、'' 都视为False。空类型
: None
为空类型。各数据类型之间是能够相互转换的,可以使用Python提供的内置函数:
另外2个字符转化内置函数:
变量
(英语:Variable,scalar),是内存中实际存在的数据或存储器中存储数据的一块内存空间地址,变量的值能够被读取和修改。
Python 中的变量是内存中保存数据的地址的一个别称。变量是没有类型的,变量对应的值对象是有类型的。变量的类型是跟着值对象走的。严格来讲,类型是属于对象的,而不是变量, 变量和对象是分离的,对象是内存中储存数据的实体,变量则是指向对象的内存地址。
在Python 的语法中,变量无需声明,可直接使用,区别于其余语言,有些语言的变量须要先声明后使用。python中,使用像上边代码中的等号‘=’来表示赋值
,即表示将等号右边的数据赋值给左边的变量,变量的类型有它存储的数值来决定。
>>> a = 123 >>> b = '123' >>> c = True >>> print(type(a),type(b),type(c)) (<type 'int'>, <type 'str'>, <type 'bool'>) >>> d, e = 1,2
知识点:
- 咱们可使用内置函数
type
来查看变量的数据类型。- 可同时给多个变量赋值
变量的命令是一个重要的规则,好的命名能够增长代码的可读性,提升代码的可维护性。python中变量的命名有以下要求:
说明:
- 系统预留字,及系统的函数及模块的名字。
除了以上这些硬性规定外,变量命名仍是比较宽松的。为了更好的处理命名问题,python 社区指定了一个开发规范 PEP8。其中除了命名规范外,还描述了其余一些语法的最佳实践。它可做为咱们往后编写代码及项目开发的规范使用,对咱们提升代码的质量有很大的好处。
做用域,顾名思义,能够理解为在必定范围内起做用。映射到咱们的编码中时,即是在必定的代码范围内有效。在编码时,代码分各类逻辑块的,相似咱们文章的段落,能够更好的理解阅读分类。那么在这些限定的范围内,变量的有效性是有影响的。根据有效范围做用域分为全局变量(Local)
和局部变量(Global)
。全局变量
是在整个程序系统或文件全局中有效的变量。局部变量
表示在一个代码逻辑块中有效的变量。全局和局部变量是相对的,如咱们能够叫一个相对于文件来讲的全局变量,可是在多个文件或者文件包中便成了局部变量。除了全局和局部变量,Python中还有如下做用域:
做用域以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包,稍后会讲),再找不到就会去全局找,再者去内建中找。
变量中存储的数值是能够变更的,那么有没有不变的呢?答案是有的,如数学计算使用的PI
。咱们常常把代码中,存储不变数据的变量称之为常量
。可见,常量是一种特殊的变量。
上节咱们谈到变量有许多的数据类型,其中字符串类型比较复杂,这里单独讲解下。
字符串,故名思意,是零个或多个字符组成的有限序列,以单引号或双引号包裹。既然是以字符组成,那么便包括单引号或双引号自身,以下:
a = 'I'm DeanWu!'
咱们在执行以上语句的时候会报错:
>>> a = 'I'm DeanWu!' File "<stdin>", line 1 a = 'I'm DeanWu!' ^ SyntaxError: invalid syntax
这是由于字符串中间的单引号把字符串给截断了,当python解释器执行到该单引号后,后边的语法便报错了。如何解决?这便须要进行转义,所谓转义,即是让python解释器解释执行的时候,被转义的字符不在表示原先的意思,而变为不解释执行的字符串。Python中使用 \
进行转义。上边的语法能够写成这样:
a = 'I\'m DeanWu!'
在计算机基础部分,咱们知道了计算机编码相关知识,归纳以下:
接下来,咱们看下Python中的编码。Python2中的默认编码为ASCII编码
,Python3中使用的则是UTF-8编码
。可以使用以下命令查看:
import sys sys.getdefaultencoding()
在Python 编程中,编码问题每每是新手的一个困扰,咱们来深刻展开说下这个问题。Python2和Python3的默认编码是不同的,它们处理编码方式也是不同。
Python2中的编码
在 Python2中字符串类型有4种:str
、unicode
、basestring
和bytes
。
basestring
是一个基类(稍后会讲到此概念,可暂时理解为父亲或基础便可),str
和unicode
类型在此基础上构建。str
是Python设计之初的字符串类型,默认使用系统编码。unicode
是了使Python支持Unicode编码,在2.0版本以后添加的一种字符串类型。bytes
是字节串,str
自己即是一个字节串,那可认为bytes
是str
的一个别称,使用和str
彻底一致。看一实例:
>>> a = '你好' # 使用系统编码的str 类型 >>> type(a) <type 'str'> >>> print a 你好 >>> a '\xe4\xbd\xa0\xe5\xa5\xbd' # 系统编码为 utf-8的字节码,使用了3个字节表示一个汉字; >>> ua = u'你好' # unicode 编码 >>> type(ua) <type 'unicode'> >>> print ua 你好 >>> ua u'\u4f60\u597d' # unicode 编码格式的你好,对应unicode代码表中代码 >>> b = b'你好' # bytes 类型的字符串 >>> type(b) <type 'str'> >>> print b 你好 >>> b '\xe4\xbd\xa0\xe5\xa5\xbd' # 使用3个字节表示1个汉字,且字节码和str类型同样;
知识点:
- Python 解释器默认使用系统的编码方式声明变量。
- unicode类型以u开头标识
- bytes 类型以 b 开头标识
- str类型以16进制的ASCII字节码表示,其实是一个字节串,回应了它的另外一个名字bytes。
- unicode类型以unicode字符码表示,是真正的字符串。
str
与unicode
类型之间是能够相互转化的,经过 encode
和decode
来实现。来看实例:
>>> a = '你好' >>> a.decode('utf-8') # decode 解码: str类型(UTF-8) --> unicode类型(Unicode) u'\u4f60\u597d' # 对应的unicode代码 >>> ua u'\u4f60\u597d' >>> ua.encode('utf-8') # encode 编码: unicode类型(Unicode) --> str类型(UTF-8) '\xe4\xbd\xa0\xe5\xa5\xbd' # utf-8的编码的 str字节串 >>> a.decode('gbk') # 尝试使用 gbk 解码,结果出现乱码 u'\u6d63\u72b2\u30bd' >>> print a.decode('gbk') 浣犲ソ >>> a.decode('gbk').encode('gbk') # 使用 gbk 解码,再编码,成功还原 '\xe4\xbd\xa0\xe5\xa5\xbd' >>> print a.decode('gbk').encode('gbk') 你好 >>> a.decode('gbk').encode('utf-8') # 使用不一样的编码来解码和编码, 也出现乱码 '\xe6\xb5\xa3\xe7\x8a\xb2\xe3\x82\xbd' >>> print a.decode('gbk').encode('utf-8') 浣犲ソ
知识点:
- 使用什么编码编码,就须要使用什么编码解码,不然会出现乱码。
- 转为
unicode
类型要decode解码。- 转为
str
类型要encode编码。- 区分Unicode类型和Unicode编码,Unicode编码是一套编码集,内容丰富,编码内容涵盖了世界各地的语言,实现方式有UTF-八、UTF-1六、UTF-32;Unicode类型只是python字符串的一种类型,使用Unicode编码做为其编码格式,可通过各类编码方式(UTF、GBK、ASCII)编码成str类型字符或者叫bytes(字节序列)类型供计算机使用。
- Unicode 编码的兼容性,可做为其余编码格式的转码的中间站。
上边这些例子是直接在python解释器中跑的代码,而python代码文件在执行时,有所不一样,会受到文件编码的影响。
文件的存储是以二进制流的方式保存在硬盘上。当Python文件被执行时,这些文件会以二进制流的方式加载到内存中,而后按照Python的默认编码方式解码成相应的python代码对应的unicode编码的字节码来解释执行。在python2中,默认编码为ASCII码,那么当文件中有非ASCII码时,这个解码过程便会出错。Python 为了解决这个问题,在Python 文件头部增长了文件的编码声明,PEP236就是为这个问题而建立的改进意见。
Python 文件格式声明以下:
# coding:utf-8
或
# -*- coding:utf-8 -*-
来看实例 coding_utf.py
:
# -*- coding:utf-8 -*- a = '你好' print(a) print(type(a)) ua = u'你好' print(ua) print(type(ua))
在命令行执行python coding_utf.py
, 返回以下:
你好 <type 'str'> 你好 <type 'unicode'>
ok,没有问题。来看下执行时都作了些什么事:
接下来,当咱们把文件编码和开头标识改成GBK
后,再次执行:
��� <type 'str'> 你好 你好 <type 'unicode'>
你们看到第一个你好
成为乱码,这是为何? 根据上边的分析,打印时,a的编码为gbk, ua的编码为unicode。而我终端的编码为utf-8,对gbk的不兼容,因此致使乱码。一样的代码,当放到默认gbk编码的windows终端中,则会输出正常。
那么有没有办法让他输出正常呢?有的,咱们只要手动显示的把它解码成兼容的 unicode 编码便可。
print(a.decode('gbk'))
到这里,总结以上说的问题,影响Python 字符编码的地方主要有如下几点:
Python3中编码
在python2中,编码问题有2个大的问题:
str
和 unicode
两种类型,让你们容易混淆;Python3 对以上问题作了很好的修正。Python3 默认编码改成了 UTF-8
,对于非ASCII码支持更强大。其次,Python3 合并了str
和 unicode
类型,统一为 str
类型。使用 bytes
类型来表示字节类型。这样很好的区分了字符串和字节串,str
即为字符串,bytes
为字节串或叫二进制字节。
看下面的例子:
>>> a = '你好' # utf-8 编码的str类型 >>> type(a) <class 'str'> >>> print(a) 你好 >>> repr(a) "'你好'" >>> a # 显示为原字符串 '你好' >>> ua = u'你好' >>> type(ua) # unicode 编码的 str类型 <class 'str'> >>> print(ua) 你好 >>> repr(ua) "'你好'" >>> ua # 能够看到,字符串直接显示并无显示unicode编码 '你好' >>> a.decode('utf-8') # unicode 字符串已不能再解码了 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'str' object has no attribute 'decode' >>> a.encode('utf-8') # 显示为字节串 b'\xe4\xbd\xa0\xe5\xa5\xbd' >>> e = 'Test' >>> e 'Test' >>> e.encode('utf-8') # 显示为原字符串 b'Test'
知识点:
- 一、能够看到Unicode类型的字符串类型为 str,带不带u 是同样的。
- 二、unicode 字符串编码成utf-8格式的字节码,前边带 b 说明是bytes 字节类型。
- 三、在Python3中,全部unicode编码显示均为原字符串,非 unicode 编码的 非ASCII码范围的字符 显示均为字节串。
字符串中的运算符
>>> a = '你好' >>> b = '世界' >>> print(a+b) 你好世界
>>> print(a*2) 你好你好
len
内建函数,能够获取字符串的字节长度>>> a = '你好' >>> a '\xe4\xbd\xa0\xe5\xa5\xbd' # utf-8 编码,3个字节表明一个汉字。 print(len(a)) >>> e = 'hello' >>> print(len(e)) 5
[]
索引,可经过下标的方式来获取字符串的某个字节,下标是从 0 开始的,最后一个为'字符串长度-1'或'-1'。>>> print(a) helloworld >>> a[2] 'l' >>> a[0] 'h' >>> a[9] 'd' >>> a[-1] 'd'
[:]
切片,可以使用字符串下标来截取字符串>>> a = 'helloworld' >>> a[0:5] 'hello'
> 说明:
- 下标从零开始
- 开始能够省略,默认为0
- 结束能够省略,默认为-1
in
判断某变量是否在字符串中。>>> a = 'helloworld' >>> 'hello' in a True
格式化
有时候,咱们要将多个变量组成一个咱们须要的字符串来使用,这个过程叫作格式化
。Python中格式化的方式有两种,一种使用‘%’ ,一种是使用format
内建函数。
%
格式化,格式化变量,依次由左向右对应。>>> c = '%s,%s!'%(a,b) >>> print(c) 你好,世界!
使用 %
来格式化时,%s
中的s
叫作占位符
,不一样的类型须要不一样的占位符
,以下:
占位符 | 类型 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
format
格式化,格式化变量,由左向右根据大括号的序号对应。>>> d = '{1},{0}'.format('世界','你好') >>> print(d) 你好,世界
经常使用方法
可以使用内建函数dir
查看某对象的方法:
>>> dir(a) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] >>>
endswith(‘’)
是否以某字符串结尾,是则返回True
,不然返回False
;startswith('')
是否以某字符串开始,是则返回True
,不然返回False
;split()
分隔字符串,返回一个列表(python高级数据结构,稍后讲解)。lower()
转为小写。upper()
转为大写。strip('')
2侧去除某字符串。lstrip('')
左侧去除某字符串。rstrip('')
右侧去除某字符串。join()
以某字符串为链接符,合并某列表。ljust(int)
左对齐,并使用空格填充至指定长度的新字符串rjust(int)
右对齐,并使用空格填充至指定长度的新字符串在编程世界中的表达式和咱们数学上的表达式有些相似,都是一种句法,此处意义更纯粹,有运算符和操做数组成。例如:2+3
,其中像+
相似的符号即为运算符
,可经过它对操做数作相应操做。2和3 即为操做数。
运算符,顾名思义,能够经过它对一些变量作运算
处理。此处的运算除了简单的四则运算,还包括比较、赋值等复杂操做。Python中运算符主要包括如下几种:
下面咱们一一来看。
算数运算符
算数运算符,主要对程序中的变量作四则运算使用。主要包含以下运算符:
比较运算符
比较运算符,用来比较变量是否相等,返回置为布尔类型。主要包含如下运算符:
注意:
- python2中运行不一样类型的变量做比较,比较时会自动作类型转化,由简单类型向复杂类型转变。
- python3只容许同类型变量比较。
逻辑运算符
逻辑运算符,将变量按必定逻辑组合成一个新的表达式,该表达式返回一个布尔类型的值。经常用来做为判断条件时间,判断组合的新表达式是否成立。逻辑运算符主要包含如下:
赋值运算符
赋值运算符,即将某个值赋给默一遍量的运算符。主要包含以下:
注意:
//=
与/=
在python2中都为取整除法
位运算符
位运算符,是针对二进制数据的一种字节位的运算,主要包含如下符号:
成员运算符
成员运算符,判断某变量是否包含另外一变量。主要包含如下符号:
身份运算符
身份运算符,判断是否2个变量的值及引用的内存地址是否同样。
注意:
- 与比较运算符
==
比较,==
为值相等便可,内存引用地址可不一样;is
则为值和内存引用地址均相同。
运算符优先级
各运算符按照优先级由高到低的顺序排列以下:
前边说过,表达式是一种句法,有运算符
和操做数
组成。下面咱们来看一个例子:
# -*- coding:utf-8 -*- length = 10 width = 5 area = length*width print(area)
本例子,使用表达式计算了长方形的面积。变量length
表示长方形的长,变量width
表示长方形的宽,使用算数运算符*
,利用表达式进行了乘法计算。经过赋值运算符=
将表达式的值赋值给了变量 area
。这个过程当中,表达式在其中起了核心逻辑的做用。这个简单的程序也映射了咱们平时的编码过程,表达式在其中起了相当重要的做用,咱们要善加利用。
计算机要处理任务,则须要与人交互。那么python中的输入输出是如何实现的呢?
python2 中提供了输入函数 input
、raw_input
来输入,函数print
来输出。python3中raw_input
函数去掉了,功能合并到input
。
输入
先来看下,python2 中raw_input
。
>>> raw_input('请输入:') >>> raw_input('请输入:') 请输入:123 '123' >>> raw_input('请输入:') 请输入:abc 'abc'
可见 raw_input
返回咱们输入的数据为一个字符串返回。
再来看下 input
,它除了支持字符串还支持表达式,以下:
>>> input('请输入:') 请输入:1+2 3 >>>
可见它输出了表达式的值,也就是说它执行了表达式。试想,若是这里放一个破坏咱们系统执行的表达式,咱们系统便会受到安全威胁。在人们衡量后,在python3中,决定去除该函数,并将原来的raw_input
更名为 input
。
输出
python2 中使用print
语句来输出,python3中则改成了 print
函数。
>>> print('你好', end=',') 你好,>>> a = '世界' >>> print('你好,%s'%a) 你好,世界 >>> print('你好', '世界') 你好世界
语法说明:
end=
参数, 传递给参数的字符将追加到打印字符串结尾,当省略时默认为回车换行。print
函数可传入多个字符串来打印,当传入多个时,会自动合并连接。print
函数常被用来在调试代码时,打印变量使用。到此,咱们把Python的基本语法和数据结构过了一遍。那咱们来总结下,咱们都学到了什么:
这些只是基本语法的组成元素。在程序运行时,可能会有多种状况,须要对这些结构作判断或者须要按顺序读取列表的所有元素,那么这个时候便须要逻辑处理结构。下一章,咱们来说解Python中的逻辑处理的控制流语法。
'Hello'.startswith('H') 'Hello'.endswith('o')
>>> text = 'Hello World' >>> text.ljust(20) 'Hello World ' >>> text.rjust(20) ' Hello World' >>> text.center(20) ' Hello World ' >>>
""" 将华氏温度转换为摄氏温度公式: F = 1.8C + 32 """ f = float(input('请输入华氏温度: ')) c = (f - 32) / 1.8 print('%.1f华氏度 = %.1f摄氏度' % (f, c))
""" 输入半径计算圆的周长和面积 """ import math radius = float(input('请输入圆的半径: ')) perimeter = 2 * math.pi * radius area = math.pi * radius * radius print('周长: %.2f' % perimeter) print('面积: %.2f' % area)
""" 输入年份 若是是闰年输出True 不然输出False """ year = int(input('请输入年份: ')) # 若是代码太长写成一行不便于阅读 可使用\或()折行 is_leap = (year % 4 == 0 and year % 100 != 0 or year % 400 == 0) print(is_leap)