py17day01
一、python简介
-Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议[2] 。Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。
二、python与其他语言对比
-Python & C:
Python 跨平台,Linux all,S60,Windows,OSX,FreeBSD,这点是C#无法相比的;
Python开源,绝大多数资源都是开源的,C#则相反;
Python是解释型语言,C#需要编译(如asp.net);
-Python & Java:
开源方向来说,Python更有优势,Java(虽然最近Java已经开源了,但有一些开源协议上面的版权受限);
Python更简洁,Java过于庞大复杂(如Web服务器)
如 Python & C# 的第三点
-Python & c++,perl:
Python更容易学习,语法简单,语意化,易懂
-Python & php:
php是世界上最好的语言!
-Python & Ruby:
Ruby 小日本做的
三、python分类
-cpython:由c语言所写的python解释器,解释顺序是由python代码转成c字节码,再转成机械码,解释过程为逐行解释。
-pypy:不同于cpython的逐行解释,一行一行执行,pypy解释过程为全部转换为为c字节码后,再统一执行。
-其它python(如jpython等):由py代码转化为其他语言字节码,在转化为机械码执行。
四、python基础
-python默认以.py结尾,文件开头标注:
#!/usr/bin/env python ----------->第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
#-*- coding:utf-8 -*- ----------->第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
-linux下也可以直接赋予权限执行:
chmod 755 1.py
./1.py
-编码:
-ASCII码:python早起版本只支持ascii码,因为ascii码一个字符只占8位,故最多只有2**8=256个字符
如:字母A用ascii编码是十进制的65,二进制的01000001
-万国码(Unicode) :后期支持万国码,一个字符占16位
如:A 00000000 01000001 中文占24位 如:中 01001110 00101101
-utf-8,对万国码压缩 :UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,
汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。
-gbk,gb2312 :A 01000001,中 10000000 00000000 00000010 。
| 字符 | ASCII | Unicode | UTF-8 |
|---|---|---|---|
| A | 01000001 | 00000000 01000001 | 01000001 |
| 中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
如中文:龙
utf-8,需要使用三个字节来表示 24 10000000 00000000 00000010
gbk, 需要使用二个字节来表示 16 00100110 00000010
-在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言,例如:
>>> print('包含中文的str')
包含中文的str
对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
>>> ord('A') 65 >>> ord('中') 20013 >> chr(66) 'B' >>> chr(25991) '文'
-由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
-Python对bytes类型的数据用带b前缀的单引号或双引号表示:
x = b'ABC'
-要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。
-以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:
>>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87'
纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。
在bytes中,无法显示为ASCII字符的字节,用\x##显示。
-反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:
>>> b'ABC'.decode('ascii') 'ABC' >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') '中文'
-申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码:

-关于IDE:pycharm的使用:
-文件编码:Editor > File Encodings
-文件模板:Editor > File and Code Templates > Python Script
-滑动鼠标滚轮改变代码大小:Editor > General > Change font size(Zoom) with Ctrl+Mouse Wheel
-快捷键:
ctrl + ?:一次实现多行#注释
-py中注释:
# 单行注释
""" """ 多行注释
-.pyc文件:
此文件为对应.py文件转换好的字节码文件
五、变量、输入、输出
-变量:
变量名可以为字母,数字(不能开头),下划线,不能使用python内置关键字
-输入,输出:
1 >>> v = input('-->') 2 --> value 3 >>> import getpass 4 >>> p = getpass.getpass('-->') 5 Warning: Password input may be echoed. 6 --> password 7 >>> print(v) 8 value 9 >>> print(p) 10 password
六、条件语句、循环语句
-条件语句:
-if....else:
1 >>> name = input("name:") 2 name: dylan 3 >>> passwd = input("password:") 4 password: 123 5 >>> if name == 'dylan' and passwd == '123': 6 ... print("login successful") 7 ... else: 8 ... print("login failed") 9 ... 10 login successful
-if....elif....else:
>>> name = input("name:") name: elaine >>> passwd = input("password:") password: 123 >>> if name == 'dylan' and passwd == '123': ... print("dylan login successful") ... elif name == 'elaine' and passwd == '123': ... print("elaine login successful") ... else: ... print("login failed") ... elaine login successful
-循环语句:
-while 条件:
continue # 立即开始下次循环
break # 跳出所有循环
-练习:
1、使用while循环输入 1 2 3 4 5 6 8 9 10
>>> n = 1 >>> while n < 11: ... print(n) ... n+=1
2、求1-100的所有数的和
>>> sum = 0 >>> n = 1 >>> while n < 101: ... sum+=n ... n+=1 ... print(sum) 5050
3、输出 1-100 内的所有奇数
>>> n = 1 >>> while n < 101: ... if n%2 == 1: ... print(n) ... n+=1 ... else: ... n+=1
4、输出 1-100 内的所有偶数
>>> n = 1 >>> while n < 101: ... if n%2 == 0: ... print(n) ... n+=1 ... else: ... n+=1
5、求1-2+3-4+5 ... 99的所有数的和
>>> n = 1 >>> num = 0 >>> while n < 100: ... if n%2 == 1: ... num+=n ... n+=1 ... else: ... num-=n ... n+=1 ... >>> print(num) 50
6、用户登陆(三次机会重试)
n = 3 while n > 0: name = input("Enter your name:") pwd = input("Enter your password:") if name == 'Elaine' and pwd == '123': print("Login successful!") break else: n-=1 print("Name or password is wrong!You have %s chances left!"%n)
七、运算
-运算符:
http://www.runoob.com/python/python-operators.html
>>> if 1 == 1 or 1 > 2 and 1 == 4: ... print('True') ... else: ... print('False') ... True
>>> if 1 == 1 and 1 > 2 or 4 == 4: ... print('True') ... else: ... print('False') ... True
八、数据类型
-Python数据类型
-整数 int:
创建:
a = 123
a = int(123)
转换:
age = "18"
new_age = int(age)
-布尔值 :
创建:
a = True
b = False
转换:
数字转换,只有0是False,其他True
字符串, 只有""是False,其他True
........
-字符串:
创建:
a = "dylan"
a = str('dylan')
转换:
age = 19
new_age = str(age)
字符串的拼接:
>>> name = 'dylan' >>> gender = 'boy' >>> new_str = name + gender >>> print(new_str) dylanboy
字符串格式化 :
%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,
后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。
常见占位符:
| %d | 整数 |
| %f | 浮点数 |
| %s | 字符串 |
| %x | 十六进制整数 |
>>> s = "My name is %s,I'm %s years old now." >>> print(s%('Dylan',29)) My name is Dylan,I'm 29 years old now.
判断子序列是否在其中:
因为是字符串,故可以使用成员运算符来判断。
移除空白:
>>> val = ' dylan ' >>> val.lstrip() 'dylan ' >>> val.rstrip() ' dylan' >>> val.strip() 'dylan'
分割:
str.split(str="", num=string.count(str)) str--分隔符,num--分割次数
>>> str1 = 'dylan 28 18000 1 2 3 4' >>> str1.split(' ',1) ['dylan', '28 18000 1 2 3 4'] >>> str1.split(' ',3) ['dylan', '28', '18000', '1 2 3 4']
长度(字符):
>>> name = 'dylan' >>> len(name) 5
索引:
>>> name[0] 'd' >>> name[1] 'y' >>> name[-1] 'n'
切片:
>>> str2 = 'MyNameIsDylan' >>> str2[0:2] #从0开始到2(不取2) 'My' >>> str2[3:5] #从3开始到5 'am' >>> str2[5:] #从5到最后 'eIsDylan' >>> str2[5:-2] #从5到-2(不取-2) 'eIsDyl' >>> str2[-2:] # 从-2到最后 'an' >>> str2[::2] #从头到尾,步长为2 'MNmIDln' >>> str2[2:8:2] #从2到8,步长为2 'NmI'
>>>s = 'abcdefgh' #s[::-1]表示从右往左,以步长为1进行切片 >>>s[::-1] 'hgfedcba' >>>s[::2] # s[::2] 表示从左往右以步长为2进行切片 'aceg'
-列表:
创建:
a = ['dylan','elaine']
a = list(['dylan','elaine'])
索引:
val = a[0]
长度:
val = len(a)
切片:
和字符串类似
>>> abc = ['a','b','c','d','e','f'] >>> abc[0:-1:2] ['a', 'c', 'e'] >>> abc[::2] ['a', 'c', 'e']
追加:
>>> abc.append('abcdef') >>> abc ['a', 'b', 'c', 'd', 'e', 'f', 'abcdef']
插入:
>>> abc.insert(2,'abc') >>> abc ['a', 'b', 'abc', 'c', 'd', 'e', 'f', 'abcdef'] >>> abc.insert(0,'0') >>> abc ['0', 'a', 'b', 'abc', 'c', 'd', 'e', 'f', 'abcdef']
删除:
>>> abc.remove('abc') >>> abc ['0', 'a', 'b', 'c', 'd', 'e', 'f', 'abcdef']
更新:
>>> abc[7] = 'ghijkl' >>> abc ['0', 'a', 'b', 'c', 'd', 'e', 'f', 'ghijkl']
-字典:
创建:
d = {'name':'dylan','pwd':'123'}
索引获取值:
>>> d = {'name':'dylan','pwd':'123'}
>>> d['name']
'dylan'
增加key,value:
针对存在的key,则修改其对应的value
>>> d['age'] = 29 >>> d {'pwd': '123', 'name': 'dylan', 'age': 29} >>> d['name'] = 'elaine' >>> d {'pwd': '123', 'name': 'elaine', 'age': 29}
删除:
>>> del d['age'] >>> d {'pwd': '123', 'name': 'elaine'}
for循环遍历字典的操作:
>>> dict = {'a':1,'b':2,'c':3,'d':4,'e':5}
>>> for i in dict:print(i)
d
a
c
b
e
>>> for i in dict.keys():print(i)
d
a
c
b
e
>>> for i in dict.values():print(i)
4
1
3
2
5
>>> for key,value in dict.items():print(key,value)
d 4
a 1
c 3
b 2
>>> print(len(dict)) 5
字典嵌套:
>>> dict = { "河北": { "石家庄": ["鹿泉", "藁城", "元氏"], "邯郸": ["永年", "涉县", "磁县"], }, "河南": { "郑州": ["登封", "新密", "新郑"], "许昌": ["禹州", "襄城", "长葛"], }, "山西": { "太原": ["太原", "古交", "清徐"], "大同": ["左云", "阳高", "天镇"], } } >>> dict["山西"]["大同"][2] '天镇'
九、文件操作
-db.txt
dylan|123|0|0 elaine|123|10000000000089114|3 admin|123|99999999761000|3
-打开文件并读取其中内容操作:
>>>f1=open('D:\python\python3\s17day1_dylan_wu_homework\db.txt','r') >>> data = f1.read() >>> f1.close() >>> print(data) dylan|123|0|0 elaine|123|10000000000089114|3 admin|123|99999999761000|3 >>> type(data)
<class 'str'>
-构成新user_list对其中用户元素进行修改:
>>> user_info_list = data.split('\n') #去掉换行符 >>> print(user_info_list) ['dylan|123|0|0', 'elaine|123|10000000000089114|3', 'admin|123|99999999761000|3'] #得到user_info_list >>> user_list = [] #定义一个空列表 >>> for i in user_info_list: ... temp = i.split('|') #去掉'|',得到temp列表 ... dic = {'name':temp[0],'pwd':temp[1],'balance':temp[2],'locked':temp[3]} #构成用户信息字典 ... user_list.append(dic) #构成用户信息总表 ... >>> user_list [{'locked': '0', 'name': 'dylan', 'balance': '0', 'pwd': '123'}, {'locked': '3', 'name': 'elaine', 'balance': '10000000000089114', 'pwd': '123'}, {'locked': '3', 'name': 'admin', 'balance': '99999999761000', 'pwd': '123'}] >>> user_list[1]['locked'] = '2' #修改用户锁定次数 >>> user_list [{'locked': '0', 'name': 'dylan', 'balance': '0', 'pwd': '123'}, {'locked': '2', 'name': 'elaine', 'balance': '10000000000089114', 'pwd': '123'}, {'locked': '3', 'name': 'admin', 'balance': '99999999761000', 'pwd': '123'}]
-将修改后的user_list还原为字符串:
>>> user_str = '' #定义一个空字符串 >>> for e in user_list: ... l = [e['name'],e['pwd'],e['balance'],e['locked']] #将字典中的用户元素还原为列表 ... new_str = '|'.join(l) + '\n' #还原为用户字符串 ... user_str+=new_str ... >>> user_str 'dylan|123|0|0\nelaine|123|10000000000089114|2\nadmin|123|99999999761000|3\n' #得到用户字符串
-写入文件:
>>> f2 = open('D:\python\python3\s17day1_dylan_wu_homework\db.txt','w') >>> f2.write(user_str) 72 >>> f2.close()

浙公网安备 33010602011771号