Python的基础——Python学习笔记02

来源:互联网 发布:ubuntu输入法设置 编辑:程序博客网 时间:2024/06/06 08:47

前言

Python是一种计算机编程语言。
计算机要根据编程语言执行任务,就必须保证编程语言写出的程序不能有歧义,故任何编程语言都有自己的一套语法,编译器或解释器就是负责把符合语法的程序代码转换成CPU能够执行的机器码,然后执行。
Python的语法采用缩进方式,写出的代码像下面的样子:

#print absolute value of an integer:a = 100if a >= 0    print(a)else:    print(-a)

以#开头的语句是注释。其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块。
Python使用缩进来组织代码块,坚持使用4个空格的好习惯。另外,务必注意的地方是Python是大小写敏感的,像SQL语句则不区分大小写。


Python的输入输出

输出
用print()在括号中加上字符串,就可以向屏幕上输出指定的文字。比如输出’hello, world’,用代码实现如下

>>>print('hello,world')

print()函数可以输出多个字符串,用逗号“,”隔开,就可以连成一串输出:

>>>print('The quick brown fox','jumps over','the lazy dog')The quick brown fox jumps over the lazy dog

print()函数会一次打印每个字符,遇到逗号”,”会输出成空格;
print()也可以打印整数,或者计算结果:

>>>print('100+200=',100+200)100+200=300

注意,对于100+200,Python解释器会计算出结果300,但是'100+200='是字符串而非数学公式,Python把其视为公式,print()函数便会依次打印出每个字符。

输入
Python提供了一个input()函数,可以让用户输入字符串,并存到变量中。比如放一个用户名:

>>>name=input()mojian

当你输入name=input()并按下回车时,Python交互器就等着用户输入了。输入任意内容后,按下回车完成输入。输入完成后,什么都不会提示,Python交互器又回到>>>状态了。用户刚输入的内容其实存放到name变量里了。可以直接输入name查看变量内容:

>>>name'mojian'

可以利用输入输出函数把打印的hello,world改善成一个小程序了:

name=input('please enter your name:')print('hello',name)

再次运行This程序时,会首先打印please enter your name:
,这时用户就可以根据这个提示输入名字,得到hello,xxx的输出:

C:\workspace>python hello.pyplease enter your name:mojianhello,mojian

数据类型和变量

在python中能直接处理的数据类型有以下几种:
整数

浮点数
Python的浮点数没有大小限制,但是超出一定范围就直接表示为inf(无限大)。
字符串
字符串是以单引号'或双引号"括起来的任意文本。如果'本身也是一种字符串,那么可以用""括起来,如果字符串内部包含两者,可以用转义符\来标识,如:

'I\'m \"OK\"!'

表示的字符串内容是I’m “OK”!
转义字符可以转义很多字符,比如\n可以表示换行,\t表示制表符,字符\本身也要转义,所以\\表示的字符就是\
Python还允许用r''表示''内部的字符串默认不转义,还能用'''...'''的格式表示多行内容。当然'''...'''前面还可以加r使用。

布尔值
在Python中可以直接用TrueFalse表示一个布尔值(注意大小写),布尔值可以用andornot运算。
and运算是 与运算 ,只有所有都为True时,运算结果才是True
or运算是 或运算,只要其中一个为True,运算结果就是True
not运算是 非运算,它是一个单目运算,把True变成False,把False变成True
布尔值经常用在条件判断中,如:

if age >= 18:    print('adult')else:    print('teenager')

空值
空值是Python中一个特殊的值,用None表示。None不能理解为0,因为0是有意义的。

变量
在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。
变量在程序中就是用一个变量名表示,变量名必须是大小写英文、数字、和_的组合,且不能以数字开头。
在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。
请不要把赋值语句的等号等同于数学的符号,如:

x = 10x = x+2

在数学上,x=x+2是不成立的,但是在程序中,赋值语句先计算右侧的表达式x+2,得到结果12,再赋给变量x
理解变量在计算机内存中的表示也很重要,当我们赋值一个变量a = 'ABC'时,Python干了两件事:
1.在内存中创建了一个ABC的字符串;
2.在内存中创建了一个名为a的变量,并把它指向ABC

常量
常量就是不能改变的量,通常用全部大写的变量名表示常量。
在Python中,有两种除法:
一种除法是,其计算结果是浮点数,即使是整除,结果也是浮点数:

>>>9 / 33.0

另一种除法是//,称为地板除,两个整数的除法仍然是整数:

>>>10 / 33

Python还提供一个余数运算,可以得到两个整数相除的余数:

>>>10 % 31

综合练习
题:请打印出以下变量的值:

n = 123f = 456.789s1 = 'Hello, world's2 = 'Hello, \'Adam\''s3 = r'Hello, "Bart"'s4 = r'''Hello,Lisa!'''

不唯一答案:

>>>print('''n = 123f = 456.789s1 = 'Hello,world's2 = 'Hello,\'Adam\''s3 = 'Hello,"Bart"'s4 = r\'''Hello,Lisa!\'\'\'''')

字符串和编码

字符编码
最早美国制定的编码表是ASCII,包括大小写英文字母、数字和一些符号;
中国制定了GB2312编码,用来把中文编进去…
各国有各国的标准,就不可避免地产生冲突——乱码。
因此,Unicode把所有语言都统一到一套编码中,避免乱码的问题。
ASCIIUnicode的区别:ASCII编码是一个字节,Unicode编码通常是两个字节。
如果统一成Unicode编码,写的基本上全是英文的话,那么用Unicode编码比ASCII编码要多一倍的储存空间,所以出现了把Unicode编码转换为“可变长编码”的UTF-8编码。
现在计算机系统通用的字符编码工作方式:

1.在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
2.用记事本编辑时,从文件读取的UTF-8字符转换为Unicode字符到内存中,编辑完成后,保存时再把Unicode转换为UTF-8保存到文件:
记事本与文件的编码转换
3.浏览网页时,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
服务器与浏览器编码转换


Python的字符串
在Python3版本中,字符串使用Unicode编码。
对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:

>>>ord('中')20013>>>chr('20013')'中'

如果知道字符的整数编码,还可以用十六进制这么写str(两种写法完全是等价的):

>>>'\u4e2d\u6587''中文'

因为Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需把str变为以字节为单位的bytes
Python对bytes类型的数据用带b前缀的单引号或双引号表示:

x = b'ABC'

以Unicode表示的str通过encode()方法可以编码为指定的bytes,如:

>>>'ABC'.encode('ascii')b'ABC'>>>'中文'encode('UTF-8')b'\xe4\xb8\xad\xe6\x96\x87'

如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:

>>>b'ABC'.decode('ascii')'ABC'>>>b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')'中文'

要计算str包含多少个字符,可以用len()函数:

>>>len('ABC')3>>>len('中文')2

如果换成byteslen()函数就计算字节数:

>>>len(b'ABC')3>>>len('中文'.encode('utf-8'))6

操作字符串时,应坚持使用UTF-8编码对strbytes进行转换。
当Python解释器读取源代码时,为让它按UTF-8编码读取,我们通常在文件开头加上:

#!/usr/bin/env python3# -*- coding: utf-8 -*-

另需确保文本编辑器正在使用UTF-8 without BOM编码。


格式化
在Python中,采用的格式化方式和C语言是一致的,用%实现,如:

>>>'Hello, %s' % 'world''Hello, world'>>>'Hi, %s, you have $%d.' %('mojian', 100000)'Hi, mojian, you have $100000.'

%运算符是用来格式化字符串的,在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个占位符%?,后面就跟几个变量或者值,顺序要对应。若只有一个占位符,括号可以省略。
格式化整数和浮点数%f还可以指定是否补0和整数与小数的位数:

>>>'%2d-%02d' % (3, 1)' 3-01'>>>'%.2f' %3.1415926'3.14'

如果%只是普通字符,用%%来转义表示%


使用list和tuple

list
list是一种有序的集合,可以随时添加和删除其中的元素。
变量classmates就是一个list。

>>>classmates = [‘mojian’,’Bob’,’Tracy’]>>>classmates[‘mojian’,’Bob’,’Tracy’]

用len()函数可以获得list元素的个数:

>>>len(classmates)3

用索引来访问list中每一个位置的元素,记得索引是从0开始的,确保索引不越界,最后一个索引是len(classmates) -1.
如果要获取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:

>>>classmates[-1]Tracy

可以向list中追加元素至末尾:

>>>classmates.append(‘Adam’)>>>classmates[‘mojian’,’Bob’,’Tracy’,’Adam’]

也可以把元素插入到指定位置,比如索引号为1的位置:

>>>classmates[1,’Jack’]>>>classmates[‘mojian’,’Jack’,’Bob’,’Tracy’,’Adam’]

要删除末尾的元素,使用pop()方法,pop(i)是删除指定位置元素的方法:

>>>classmates.pop()‘Adam’>>>classmates.pop(1)>>>classmates[‘mojian’,’Bob’,’Tracy’]

要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:

>>>classmates[1] = ‘Susan’>>>>classmates[‘mojian’,’Suan’,’Tracy’]

list中的元素类型可以不同,也可以是另外一个list,如:

>>>L = [‘A’,123,False,[‘java’,’ruby']]>>>len(L)4

注意L只有4个元素,其中L(3)是一个list,可以拆开写:

>>>s = [‘java’,’ruby’]>>>L = [‘A’,123,False,s]

要拿到java可以写s[1]或者L[3][1]
如果一个list中一个元素也没有,就是一个空的list,其长度为0.

tuple
tuple和list非常相似,但是tuple一初始化就不能修改。因为其不可变,相比list更安全。

>>>classmates = (‘mojian’,’Bob’,’Jack’)

它不能使用.append(),insert()这样的方法,其他获取元素的方法和list是一样的:classmates[0],classmates[-1],但不能赋值为其他元素。

tuple的陷阱:当定义一个元素的时候,必须加一个逗号’,’,来消除歧义:

>>>t = (1,)>>>t(1,)

‘可变的’tuple:

>>>t = (‘a’,’b’,[‘A’,’B’])>>>t[2][0] = ‘X’>>>t[2][1] = ‘Y’>>>t(‘a’,’b’,[‘X’,’Y’])

条件判断

**
elif是else if的缩写,完全可以有多个elif,所以if语句的完整形式就是:

if <条件判断1>:    <执行1>elif <条件判断2>:    <执行2>elif <条件判断3>:    <执行3>else:    <执行4>

If语句是从上往下判断,如果在某个判断是True,把该判断语句执行后,就忽略剩下的elif和else.
If 判断语句还可以简写,比如:

>>>if x:print(’True’)

只要x是非零数值、非空字符集、非空list等,就判断为True,否则为False。

input
可以用input()读取用户的输入,但是input()返回的数据类型是str,str不能直接和整数或者小数比较,必须先把str转换成整数或者小数,python提供了int()函数和float()函数来完成:

s = input(‘birth:’)birth = int(s)if birth < 2000:print(‘00前’)else:print(‘00后’)

循环

Python循环有两种,一种是for...in循环,依次把list或tuple中的每个元素迭代出来,如:

nemes = ['mojian','Bob','Jack']for name in names:    print(name)

执行这段会依次打印出names中的每个元素,所以for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句。
如果计算1-100的整数之和,Python提供了range()函数,range(101)就可以生成0-100的整数序列,计算如下:

sum = 0for x in range(101):    sum = sum + xprint(sum)

第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环。
用while循环实现100以内的奇数之和:

sum = 0n=99while n > 0:    sum = sum +n    n = n-2print(sum)

实践:
利用循环依次对list中的每个名字打印出Hello,xxx!
for循环:

# -*- coding: utf-8 -*-L = ['Bart', 'Lisa', 'Adam']for s in L:    print('Hello,',s,'!')

while循环:

# -*- coding: utf-8 -*-L = ['Bart', 'Lisa', 'Adam']p = 0while p < 3 :    print('Hello,%s!' %L[p])    p = p + 1

break

在循环中,break语句可以提前退出循环,如:

n = 1while n <= 100:    if n >10: #当n=11时,条件满足,执行break语句        break #break语句会结束当前循环    print(n)    n = n + 1print('END')

continue
在循环过程中,可以通过continue语句跳过当前的这次循环,直接开始下次循环。
如用continue打印1-10的奇书:

n = 0while n < 10:    n = n + 1    if n % 2 == 0: #如果n是偶然,执行continue语句        continue #continue语句会直接继续下一轮循环    print(n)

break语句和continue语句通常必须和if语句使用。如果滥用这两个语句,会造成代码执行逻辑分叉过多。
当代码写成死循环时,利用Ctrl+C退出程序。


使用dict和set

dict
python内置了字典:dict的支持,使用键-值(key-value)储存,具有极快的查找速度。
用python写一个dict如下:

>>>d = {‘mojian’: 95, ’Bob’: 75, ’Tracy’: 85}>>>d[‘mojian’]95

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

>>>d[‘Adam’] = 60>>>d[‘Adam’]60

由于一个key只能对应一个值,所以多次对一个key放入value时,后面的值会把前面的值冲掉。
如果key不存在,dict就会报错,要避免key不存在的错误,有两种方法。
一个是通过in判断key是否存在:

>>>’Tom’ in dFalse

二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:

>>>d.get(’Tom’)>>>d.get(’Tom’,-1)-1

PS:返回None时,Python交互式命令行不显示结果。
要删除一个key时,可以用pop(key)方法,对应的value值也会从dict中删除:

>>>d.pop(‘Bob’)75>>>d{‘mojian’: 95 ,’Tracy’: 85}

注意:dict内部存放key的顺序和放入key的顺序无关。
与list的特点相反,dict的特点有:
1.查找和插入的速度极快,不会随着key的增加而变慢;
2.占用大量的内存,内存浪费多。

正确使用dict需牢记一点:dict的key必须是 不可变对象。
在python中,字符串、整数等都是不可变的,但是list是可变的,所以就不能作为key。

set
set和dict类似,也是一组key的集合,但不储存value,也没有重复的key。
要创建一个set,需要提供一个list作为输入集合:

>>>s =set ([1, 2, 3])>>>s{1, 2, 3}

显示的{1, 2, 3}只是告诉我们这个set中有三个元素,显示的顺序也不表示set是有序的。
重复元素在set中会被自动过滤:

>>>s = set([1,1, 2, 2, 3, 3])>>>s{1, 2, 3, 4}

,通过set.add(key)方法可以添加元素到set中,可重复添加但不会有效果。

>>>s.add(4)>>>s.add(4)>>>s{1, 2, 3, 4}

通过remove(key)方法可以删除元素:

>>>s.remove(4)>>>s{1, 2, 3}

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

>>>s1 = set([1,2,3])>>>s2 = set([2,3,4])>>>s1 & s2{2, 3}>>>s1 | s2{1, 2, 3, 4}

set和dict的唯一区别在于没储存对应的value。
set同样不可以放入可变对象,因为不能判断两个对象是否相等,这样就不能保证内部无重复元素。

不可变对象
对于可变对象,比如list,对list进行操作,list的内容会发生改变,如:

>>>a = [‘c’, ‘b’, ‘a’]>>>a.sort()>>>a[‘a’, ’b’, ’c']

对于不可变对象,比如str,对str进行操作,str的内容不会变化,如:

>>>a = ‘abc’>>>a.replace(‘a’, ‘A’)‘Abc’>>>a‘abc’

对于不变对象来说,调用对象本身的任意方法,都不会改变自身的内容,这些方法会创建新的对象返回,这样就保证了不可变对象本身永远是不可变的。


0 0
原创粉丝点击