输入输出,数据类型,字符串和占位符,条件语句,list和tuple
第一个.py程序
下载并安装python环境后,创建hello.py文件,编写如下内容:
print("hello world");
打开cmd输入命令,执行hello.py程序。如下:
输入和输出
输出:
print()函数可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出,如下:
print()函数会依次打印每个字符串,遇到逗号“,”会输出一个空格。因此我们会看到第一个输出是Think+2个空格+Java,而第二个输出是”Think Java”。
输入:
Python提供了一个input()函数,可以让用户输入字符串,并存放到一个变量里。如下:
以上写出所有内容。转载处:廖雪峰Python教程
Python的语法
Python的语法比较简单,采用缩进方写出来的代码就像下面的样子:
# print absolute value of an integer:
a = 100
if a >= 0:
print(a)
else:
print(-a)
以 # 开头的语句是注释,注释是给人看的,可以是任意内容,解释器会忽略掉注释。其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块。
缩进有利有弊。好处是强迫你写出格式化的代码,但没有规定缩进是几个空格还是Tab。按照约定俗成的管理,应该始终坚持使用4个空格的缩进。
缩进的坏处就是“复制-粘贴”功能失效了,这是最坑爹的地方。当你重构代码时,粘贴过去的代码必须重新检查缩进是否正确。此外,IDE很难像格式化Java代码那样格式化Python代码。
Python数据类型
整数
与其他语言类似,不同的地方是Python的整数没有大小的限制(我们经常会遇到大数的问题,强大的Python)。
浮点数
与其他语言类似,与整型一样没有大小限制。如果超出范围则显示inf(无穷大)。
字符串
与其他语言类似,’\’是转义符。
不同之处
- r’ ‘ 表示 ’ ‘ 内部的字符串默认不转义。如下:
发现:最后’之前必须是偶数个斜杆,否则报错。 - Python允许用”’…”’的格式表示多行内容。如下:
发现程序输出包括换行。
编写一段python程序
print(r'''hello,\n
world''')
得到非常满意的结果:
布尔值
与其他语言类似,用 True 和 False 代表真、假。
逻辑运算用 and、or、not 代表与、或、非。
空值
空值用 None 表示。None不能理解为0。
变量
与其他语言类似。不同之处在于Python不需要声明是何种数据类型。
比如java声明变量n需要先定义在赋值,如:int n = 1。而Python直接赋值 n = 1。
a = 123 # a是整数
print(a)
a = 'ABC' # a变为字符串
print(a)
这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言(如C/C++、JAVA等)。
当我们写:
a = 'abc'
Python解释器干了2件事情:
- 在内存中创建一个’abc’的字符串;
- 在内存中创建了一个名为a的变量,并把它指向’abc’。
既然如此,我们考虑下面代码的执行结果。
a = 'ABC'
b = a
a = 'XYZ'
print(b)
我们想,b最后应该为’XYZ’。但很可惜,b的结果并没有被a改变,这与引用不同。
实际上,Python先在内存中创建了一个’XYZ’字符串,再将a指向’XYZ’。而不是更改a原先指向的内容。
常量
在Python中,通常用全部大写的变量名表示常量:
PI = 3.14159265359
实际上,PI仍然是一个变量,如果你想改变PI的值,没人会拦你。因为Python没有任何机制保证PI不会被改变。
Python有两种除法。一种是/计算出来的是浮点数;另一种则是//整数(向下取整)。
Python还提供了一个求余运算%,与其他语言类似。
Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来。
对变量赋值x = y是把变量x指向真正的对象,该对象是变量y所指向的。随后对变量y的赋值不影响变量x的指向。
转载处:廖雪峰Python教程
字符串和编码
编码
由于ASCII编码只有127个不同的表示方式,所以不能够存放所有例如中文、阿拉伯语言等其他国家的语言。
中国制定了GB2312编码,用来把中文编进去。
全世界很多国家语言都超过127个。如果每个国家都有他自己的编码格式会造成多语言的文本中,显示出来会有乱码。
因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码的问题了。
由于表示ASCII编码中的字符,需要Unicode的第一个字节补0。本着节约的精神,UTF-8出现了。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。
工作原理图:
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
字符串
对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
# 还可以用以下方式表示
>>> '\u4e2d\u6587'
'中文'
由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。
在bytes中,无法显示为ASCII字符的字节,用\x##显示。
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
# 如果bytes中包含无法解码的字节,decode()方法会报错:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
# 如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'
# 要计算str包含多少个字符,可以用len()函数:
>>> len('ABC')
3
>>> len('中文')
2
# len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数:
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6
由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
声明用的字符集是utf-8并不是真的为utf-8,想要设置成utf-8,需要将文件的属性编码集改为utf-8。
占位符,如下:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
与C语言类似。
常见占位符:
占位符 | 替换内容 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串:
>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'
有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%:
>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'
format()
另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}……,不过这种方式写起来比%要麻烦得多:
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'
转载处:廖雪峰Pyhton教程
使用list和tuple
list
Python内置的一种数据类型列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
# 比如,列出班里所有同学的名字,就可以用一个list表示:
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
# 变量classmates就是一个list。用len()函数可以获得list元素的个数:
>>> len(classmates)
3
# 用索引来访问list中每一个位置的元素,记得索引是从0开始的;
# 当索引超出了范围时,Python会报一个IndexError错误:
>>> classmates[0]
'Michael'
>>> classmates[1]
'Bob'
>>> classmates[2]
'Tracy'
>>> classmates[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
# 如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:
>>> classmates[-1]
'Tracy'
# 以此类推,可以获取倒数第2个、倒数第3个;当然,倒数第4个就越界了:
>>> classmates[-2]
'Bob'
>>> classmates[-3]
'Michael'
>>> classmates[-4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
# list是一个可变的有序表,所以,可以往list中追加元素到末尾:
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
# 也可以把元素插入到指定的位置,比如索引号为1的位置:
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
# 要删除list末尾的元素,用pop()方法:
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
# 要删除指定位置的元素,用pop(i)方法,其中i是索引位置:
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']
# 要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
>>> classmates[1] = 'Sarah'
>>> classmates
['Michael', 'Sarah', 'Tracy']
# list里面的元素的数据类型也可以不同,比如:
>>> L = ['Apple', 123, True]
# list元素也可以是另一个list,比如:
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
# 要注意s只有4个元素,其中s[2]又是一个list,如果拆开写就更容易理解了:
# 要拿到'php'可以写p[1]或者s[2][1],因此s可以看成是一个二维数组,类似的还有三维、四维……数组,不过很少用到。
>>> p = ['asp', 'php']
>>> s = ['python', 'java', p, 'scheme']
# 如果一个list中一个元素也没有,就是一个空的list,它的长度为0:
>>> L = []
>>> len(L)
0
tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:
>>> classmates = ('Michael', 'Bob', 'Tracy')
现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0],classmates[-1],但不能赋值成另外的元素。
不可变的tuple有什么意义?
因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
tuple的陷阱:
# 当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:
>>> t = (1, 2)
>>> t
(1, 2)
# 如果要定义一个空的tuple,可以写成():
>>> t = ()
>>> t
()
# 但是,要定义一个只有1个元素的tuple,如果你这么定义:
# 定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。
>>> t = (1)
>>> t
1
# 所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:
>>> t = (1,)
>>> t
(1,)
# 最后来看一个“可变的”tuple;
# 元组中的list是不可变的,list的内容是可变的,这个理解起来很简单,跟其他语言的引用差不多。
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
练习
请用索引取出下面list的指定元素:
# -*- coding: utf-8 -*-
L = [
['Apple', 'Google', 'Microsoft'],
['Java', 'Python', 'Ruby', 'PHP'],
['Adam', 'Bart', 'Lisa']
]
# 打印Apple:
print(L[0][0])
# 打印Python:
print(L[1][1])
# 打印Lisa:
print(L[2][2])
转载处:廖雪峰Python教程
条件判断
if语句
与其他语言相比,elif是else if的缩写,完全可以有多个elif,所以if语句的完整形式就是:
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
再议input
如下代码:
birth = input('birth: ')
if birth < 2000:
print('00前')
else:
print('00后')
输入1982,结果报错:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()
这是因为input()返回的数据类型是str,str不能直接和整数比较,必须先把str转化成整数。Python提供了int()函数来完成这件事情:
s = input('birth: ')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00后')
再次运行,就可以得到正确地结果。但是,如果输入abc呢?又会得到一个错误信息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'
原来int()函数发现一个字符串并不是合法的数字时就会报错,程序就退出了。
练习
小明身高1.75,体重80.5kg。请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数:
- 低于18.5:过轻
- 18.5-25:正常
- 25-28:过重
- 28-32:肥胖
- 高于32:严重肥胖
用if-elif判断并打印结果:
代码如下:
height = 1.75
weight = 80.5
BMI = weight/(height*height)
if BMI<18.5:
print('过轻')
elif BMI<25:
print('正常')
elif BMI<28:
print('过重')
elif BMI<32:
print('肥胖')
else:
print('严重肥胖'.encode('utf-8'))
转载处:廖雪峰Python教程