Python的输入与输出、Python输入EOF判断

输入采用input()方法。input输入的元素都是以str形式保存的。输出采用print()方法。
Python中没有代表EOF的字符,因此检测到输入EOF时会直接报错EOFerror。因此我们要采用下面的写法来检测输入到EOF后停止循环输入:

while True:
try:
s = int(input())
print(s)
except:
print('input complete')
break
1
2
3
4
5
6
7
如果在cmd.exe中运行这段代码,输入Ctrl+Z即可停止输入。如果是在Pycharm内建运行框中运行这段代码,输入Ctrl+D即可停止输入。
如果是在Python中读取文件,Python到读取到文件结尾后是返回空字符串的,所以python可以这样判断:

str = ''
with open('readme.txt', 'r', encoding='utf-8') as fp:
while True:
s = fp.read(10)
if s == '':
break
str += s
print(str)
1
2
3
4
5
6
7
8
Python字符串类型、空值类型、Unicode编码、UTF-8编码、格式化字符串
字符串是以单引号’或双引号"括起来的任意文本。如果字符串内部既包含’又包含",可以用转义字符\来标识。\n表示换行,\t表示制表符,\表示\。Python还允许用r’ ‘表示’ '内部的字符串默认不转义。
空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
Unicode编码把所有语言都统一到一套编码里,这样就不会再有乱码问题。Unicode最常用的是用两个字节表示一个字符(很生僻的字符会被编码成4个字节)。比如把ASCII编码的A用Unicode编码表示,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。
UTF-8编码相当于对unicode编码的优化,它一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
注意:
Python3的字符串类型是str,在内存中以Unicode编码表示。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
Python提供了ord()方法来获取某个字符的Unicode编码,而chr()方法把Unicode编码转换成对应的字符。如:

s1 = "A"
s2 = "1"
s3 = "你"
print(ord(s1))
print(ord(s2))
print(ord(s3))
print(chr(66))
print(chr(20500))
1
2
3
4
5
6
7
8
Python对bytes类型的数据用带b前缀的单引号或双引号表示:

x = b'ABC'
1
Python提供了encode()方法可以将str编码为指定类型的bytes,decode()方法把bytes变为str。如:

s1 = "ABC"
s2 = s1.encode('ascii')
s3 = "你好"
print(s1.encode('ascii'))
print(s3.encode('utf-8'))
print(s2.decode('ascii'))
1
2
3
4
5
6
含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。为了避免乱码问题,我们应当坚持使用UTF-8编码对str和bytes进行转换。
当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行命令:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
1
2
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。除此之外,我们还要确保所使用的IDE正在使用UTF-8 编码。
格式化字符串的输出方式:
%运算符就是用来格式化字符串的。%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应。格式化整数和浮点数还可以指定是否补0和整数与小数的位数。我们还可以用format用法来格式化输出。如:

print("%2d %02d" % (3, 1))
print("%.2f" % 3.1415926)
print("{} {}".format(3, 1.21))
print("{:02d} {:.2f}".format(3, 3.1415926))
1
2
3
4
Python条件判断、循环
判断语句的形式:

if 判断条件:
执行语句......
elif 判断条件:
执行语句......
else:
执行语句......
1
2
3
4
5
6
注意elif、else的判断语句视情况添加。
Python提供了for循环和while循环(在Python中没有do…while循环),形式如下:

for x in sequence:
statements(s)

while 判断条件:
执行语句......
1
2
3
4
5
break语句会打断当前层的循环,continue语句则会直接结束本次循环,开始下一次循环。

Python不可变对象和可变对象
不可变对象指该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把新的值放在一个新地址,变量再指向这个新的地址。
可变对象指该对象所指向的内存中的值可以被改变。变量改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的地址,通俗点说就是原地改变。
在Python中,数值类型(int和float)、字符串、元组都是不可变类型。而列表、字典、集合是可变类型。

Python中的参数传递
在Python中所有的变量名都可以理解是内存中对一个对象的"引用",类似于C++中的指针。
Python中的类型是属于对象的,而不是变量。而对象分可变对象和不可变对象。比如字符串、元组和数值类型都是不可变对象,而列表、字典和集合都是可变对象。
当一个变量名(也就是对一个对象的引用)传递给函数的时候,函数自动复制一份引用。当这个变量指向的是不可变对象时,我们修改变量内容时,实际上是在内存中新开辟了一块地址,将新内容写在这里,然后把变量名指向新开辟的地址;而当这个变量指向的是可变对象时,我们修改变量内容时就类似C++中从函数名中传入指针一样,直接在变量指向的内存地址上修改。
举例:

a = 1


def fun(b):
print(id(b))
b = 2
print(id(b), id(2))


print(id(a), id(1))
fun(a)
print(a)

c = []


def fun(d):
print(id(d))
d.append(1)
print(id(d))


print(id(c))
fun(c)
print(c)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Python字典与集合
字典可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值 key:value对用冒号分割,每个键值对之间用逗号分割,整个字典包括在花括号{}中。一个key只能对应一个value,同一个key放入多个value值后放入的会把前面放入的value值覆盖。
.get()方法可指定key得到对应的value,如果key不存在则返回None。pop()方法可以删除一个key:value。
注意:
字典内部存放的顺序和key放入的顺序无关。字典查找和插入的速度极快,不会随着key的增加而变慢,但需要占用大量的内存,内存浪费多。它是一种用空间来换取时间的一种方法。
字典的key必须是不可变对象。字典(Dictionary)根据key来计算value的存储位置,这个通过key计算位置的算法称为哈希算法。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。

集合可以看成数学意义上的无序和无重复元素的集合。set同样不可以放入可变对象。集合用来存储一组key,但不存储value,在set中,没有重复的key。
我们可以使用大括号{ }或set()函数创建集合。创建一个空集合必须用set()而不是 { },因为{ }是用来创建一个空字典。
add()方法可以向set中添加元素,remove()方法可以删除元素,两个set还可以做数学意义上的交集、并集等操作。

Python集合去重原理
set的去重是通过两个函数__hash__和__eq__结合实现的。当两个变量的哈希值不相同时,就认为这两个变量是不同的;当两个变量哈希值一样时,调用__eq__方法,当返回值为True时认为这两个变量是同一个,应该去除一个。返回FALSE时,不去重。

Python列表与元组
列表即一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型,并且list里的元素也可以是另一个list。如:

M = ['A', 1, 1.5]
1
len()可求得列表元素个数,.append()末尾增加一个元素,.insert()指定位置插入一个元素,pop()删除指定位置元素。
元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号( ),列表使用方括号[ ]。元组没有.append(),.insert(),pop()方法。元组中其他访问和获取元素的方法和list是一样的。元组在定义时,其中的元素就必须被确定下来。
只有1个元素的元组定义时必须加一个逗号,,来消除歧义:

T = (1,) # 这是一个元组
1
元组的元素是不可变的,但是如果元组的某个元素是列表时,列表内的元素是可变的。

猜你喜欢

转载自www.cnblogs.com/dianziyihao/p/12446604.html
今日推荐