还是先感谢一下廖雪峰老师,廖老师的Git教程真的非常棒,开始学习廖老师的Python教程,一定也是非常棒的。廖雪峰Python教程
python输入输出
//千万记住下面的那个逗号。
print('strings',var)
//可以输出多条变量自动加空格分开。
示例:
print('1024*768=',1024*768)
- #是注释,本文中#号后面一般是运行输出值
- 以:结束,后面缩进的视为代码块
- 最好缩进4空格
- python大小写敏感
- python 特有None 空
# True False
not 1>2 # 非
True
9/3
#3.0
10//3 #版地板除
3
- Unicode 编码通常是2个字节。ASCII编码通常是1个字节。但如果文本大部分是英文就比较浪费空间,所以出现UTF-8编码。
- UTF-8是将Unicode编码依据实际情况将字符表示成1-6个字节
英文 1字节
汉子通常3字节
- 计算机内存中一般使用Unicode编码,只有要存到硬盘时才会保存为UTF-8编码。
ord('中') # 输出中的Unicode编码
#'20013'
chr(20013) #输出Unicode编码对应的字符
'xxx'.encode('ascii/unicode/utf-8') #将xxx以ascii/unicode/utf-8编码方式编码。这样方便存储到硬盘中
'中'.encode('utf-8')
b'\xe4\xb8\xad #表示已bytes存储
len('ABC') # 求字符串ABC的字符长度
#3
len(b'ABC') #计算字节数
#3
len('中文'.encode('utf-8')) #原理同上
#6
b'\xe4\xb8\xad'.decode('utf-8') #以utf-8解码字节流
#'中'
#在文件开头加入下面两行,以及设置编辑器编码方式为utf-8 without bom 格式,就是告诉编译器以utf-8编码方式读取文件,就会避免中文乱码。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#格式化输出
'hello, %s' % 'eric'
#'hello,eric'
#格式化输出与C语言基本相同
%x #十六进制整数
'%2d %02d' % '3,3'
# 3 03 #第一个三前面有空格。
list 列表
# list 是一种有序的集合,元素可以是不同类型的,也可以是一个list
myfriends = ['Wang','Wang','Hu','...']
myfriends
#['Wang','Wang','Hu','...']
len(myfriends)
#4
myfriends[1]
#'Wang'
myfriends[-1] #索引最后一个字符串,以此类推。
#'...'
myfriends.append('zhang')#在最后追加'zhang'
myfriends.insert(i,'name')#在i位置上插入'name'
myfriends.pop()#删除末尾元素
myfriends.pop(i)#删除位置上的元素
myfmaliy =['mom','papa']
myfriends.append(myfmaliy)
myfrends
#['Wang','Wang','Hu','...',['mom','papa']]
len(myfriends)
5
myfmaliy[1]
#'papa'
myfriends[4][1] #mfriends相当于多元数组
#'papa'
tuple 元组
- 与列表很相似,但初始化后就不能改变,自然就没有append或者insert之类的方法。
- 优点是代码更安全。
t =(1,3)
//定义并初始化一个元组
# 定义一个元素的元组歧义注意
t=(1) #相当于复制变量t的值为1
#正确定义一个元组如下
t=(1,) # 逗号是重点
条件编译
i = input('输入年龄')
age = int(i) # 因为input 返回值为字符串类型
if age>18:
print('you are chengren')
else:
print('weichengnian')
循环
for name in myfriends:
print(name) #打印出myfriends 里面的所有元素
range(x) #生成0-x的整数
sum =0
n =100
while n>0:
sum +=n
print(sum)
# 5050
dict 字典
d= {'A':65,'B':66,'C':67}
d['C']
# 67
'D' in d # 判断D在不在字典d中
# False
d.get('D') #判断D在不在字典d中,不在返回None
# None
d.get('D','buzai') #判断D在不在字典d中,返回自定义值
set
- 与dict 类似
# set 元素不重复,无value。要list作为输入集合
s = set ([1,3,2,2])
s
#{1,3,2}
s.add(4)
s.remove(4)
s2 =set {[2,1,5]}
s&s1
#{1,2}
s|s1
# {3,5}
函数
abs(-12)
#12
- 创建了.py文件,里面定义了一个函数如下,在控制台使用
from <fileName> import <functionName>
来导入函数,不带扩展名。 - 位置参数
def my_abs(x):
if x>0:
return xrange
else:
return -x
# 创建一个空函数,必须使用pass,否则会报错
#返回多个值
def kill(x):
return x-2 ,2
x,y =kill(7)
# 函数的默认参数
def power(x,n=2):
s=1
while n>0:
n=n-1
x *=x
return x
# 问题注意,下面两种函数多次无参数调用后输出结果不同,因为函数在定义的时候也定义了默认参数,除非自行定义为None。如下:
def add_str(L=[]):
L.append('str')
return L
# 三次调用后 ['str','str','str']
def add_str(L=None):
if L is None:
L=[]
L.append('str')
return L
- 可变参数
# 在变量前增加*,表示把list或者tuple的元素变成可变参数传进去
def cacl(num):
sum = 0
for n in num:
sum += n
return sum
cacl([1,2])
#3
cacl(1,2)
# error
def cacl(*num):
sum = 0
for n in num:
sum += n
return sum
cacl(1,2)
#3
- 关键字参数
def dog(name,age,**qt): # **是关键字的意思,按照Key-Value的格式输入,会自动组装一个dict,
print(name,age,qt)
dog('heibao','4',host='eric')
# heibao 4 {'host': 'eric'}
# 命名关键字参数
def dog(name,age,*,home,host):
print(name,age,home,host)
#只有将命名关键字输入正确才不会报错。
# 组合参数必须按顺序来
# 必选参数、默认参数 、可变参数、命名关键字参数、关键字参数
def f(a,b,C=0,*var ,**qt):
print (a,b,C,var,qt )
def f(a,b,C=0,*,var ,**qt):
print (a,b,C,var,qt )
- 递归函数
# 自己调用自己就是递归函数
def j (x):
if x == 1:
return 1
return x * j(x-1)
高级特性
切片
n=0
p=[]
while n<99:
p.append(n)
n+=1
# 创建一个列表
p[0:1] or p[:1]
#0 从0位切到1位
p[2:5]
#2,3,4 从第2位切换到5位
p[:10:2]
#0,2,4,6,8 前十位每隔两位取一
p[::10]
#0,10,20,...90 每隔十位取一
p[-2:]
#98,99 切倒数两个
#元组是不能变的列表,所以也能切片
(0,1,2,3)[:2]
#0,1
# 字符串操作也是切片
'asdf'[:3]
#'asd'
迭代
#其实就是遍历,只不过换了个叫法
# dict迭代
# 迭代key
d= {'zero':0,'one':1,'two':2}
for key in d:
print(key)
# 'zero','one',,'two'
# 迭代value
for v in d.values():
print(v)
#0
#1
#2
#迭代key and value
for k,v in d.items():
print()
#zero 0
#one 1
#two 2
列表生成式
# 好强大,好有趣的功能
>>> [x+y for x in 'abc' for y in 'def']
['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf']
>>> [x*y for x in range(1,10) for y in range(1,10) if x%2 == 0 ]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 4, 8, 12, 16, 20, 24, 28, 32, 36, 6, 12, 18, 24
, 30, 36, 42, 48, 54, 8, 16, 24, 32, 40, 48, 56, 64, 72]
>>> [x*y for x in range(1,10) for y in range(1,10) if x%2 == 0 if y%2==0 ]
[4, 8, 12, 16, 8, 16, 24, 32, 12, 24, 36, 48, 16, 32, 48, 64]
>>> d
{'zero': 0, 'one': 1, 'two': 2}
>>> [k +'='+ str(v) for k,v in d.items()]
['zero=0', 'one=1', 'two=2']
>>> [key.upper() for key in d]
['ZERO', 'ONE', 'TWO']
生成器
- 列表创建会浪费很多内存,生成器是保存列表的生成算法,用到时再计算出节省内存。
- 第一种创建方法:只要将列表的[]变成()即表示生成的是生成器。
>>> g =(x*x for x in range(10))
>>> for n in g: #不使用迭代不能全部显示。
... print(n)
...
0
1
4
9
16
25
36
49
64
81
- 第二种创建方法:定义一个函数中包含yield,下面的是将print(b) 变为yield b
# 菲波那切数列
def fib (x):
n,a,b = 0,0,1
while(n<x):
yield b #变成这样就是生成器
a,b = b ,a+b
n = n+1
return 'over'