Python笔记
1. 文件类型
.py
- 最常见的类型
.pyc
该类型是.py文件编译后的二进制文件,运行效率当然比.py文件快啦
-
编译的命令行如下:
python -O-m py_compile hello.py
.pyo
- 经过优化编译的原文件,这个比.pyc效率更高
2. 变量
命名规则:
- 变量可以是数字,字母,下划线组合,不能以数字开头
简单理解:
- Python中的变量类似是一个标签,贴向内存地址中的值,变量的重新赋值类似于标签移动
3. 运算符和表达式
赋值运算符
= 等于,赋值
+= 加等
-= 减等
*= 乘等
/= 除等
% 求余等
算术运算符
+ 加
- 减
* 乘
/ 除
// 整除法
% 求余数
/** 幂 例如: 3**2 表示3的2平方为9
关系运算符
<
>
<=
>=
!=
==
逻辑运算符
and 逻辑与
or 逻辑或
not 逻辑非
表达式概念
- 将不同的数据(包括变量,函数)用运算符用一定的规则连接起来的一种式子
4. 数据类型 (大部分计算机编程语言都有的定义,用一个盒子或者说空间把数据装起来)
整型 int
a = 123
# type() 调用该函数可得到变量的数据类型
print(type(a))
输出:
长整型 long
b = 999999999999999999999
print(type(b))
c = 99L
print(type(c))
输出:
浮点型 float
d = 13.0
print(type(d))
e = 5.0 / 2
print(type(e))
输出:
复数类型 complex
f = 3.14j
print(type(f))
输出
字符串 str (序列类型数据)
# ----单引号 ''
str1 = 'hello world'
# ----双引号 ""
str2 = "hello world"
# ----注意嵌套使用,转义字符
str3 = "hello i'm hebw"
str4 = "hello i'm \"hebw\""
# ----三引号 """""" 可用于保存文字的格式,如下str5等同于str6
str5 = """Tom:
i'm hebw,nice to see you
ok , see you again."""
str6 = "Tom:\n\ti'm hebw,nice to see you\n\tok , see you again."
# 占位符的使用
def p(x, y):
print("%s : %s" % (x, y))
p(1, 2)
p(*t)
输出:
1 : 2
元组 tuple (序列类型数据)
-
定义:
通过圆括号,中间用逗号分隔元素定义,元组和字符串一样是不可变的# ----定义空元组 t0 = () # ----定义单元素元组 t1 = (1,) # ----元组的值无法改变,以下代码将报错!!! t[1] = 31 报错!
概念:
发展出元组类型是有原因的,利用采用字符串储存userinfo = "milo 30 male",通过这个字符串可以存储一个人的信息,但是不太好操作,取出信息不能当做一个整体,而是通过索引来进行切片操作,因此诞生元组t = ('milo', 30, 'male')
列表 list (序列类型数据)
-
定义:通过中括号,中间用逗号分隔元素定义,列表中的值是可变的
# ----定义一个空列表 list2 = [] # ----定义一个元素的列表 list3 = [1]
-
添加元素:
list = [1, 2, 3] list.append(4) print(list) 输出: [1, 2, 3, 4]
-
删除元素:
# 按照元素删除,删除第一个出现的元素,其他元素不会删除 list3 = [1, 2, 3, 4, 1] list3.remove(1) print(list3) 输出: [2, 3, 4, 1] # 按照索引删除 list3 = [1, 2, 3, 4, 1] del (list3[0]) print(list3) 输出: [2, 3, 4, 1]
-
修改元素:
list3 = [1, 2, 3, 4, 1] list3[0] = 123456 print(list3) 输出: [123456, 2, 3, 4, 1]
字典 dict
-
定义:通过花括号,中间用逗号分隔元素定义.字典是Python中唯一的映射类型,无序性.
# 通过{}创建 dic = {0: 0, 1: 1, 2: 2} # 通过工厂方法dict()生成字典 fdict = dict(['x', 1], ['y', 2]) # fromkeys(),字典中的元素具有相同的值,默认为None,主要用于值一致的情况下 ddict = {}.fromkeys(('x', 'y'), -1) ddict2 = {}.fromkeys(('x', 'y')) print(ddict) print(ddict2) 输出: {'y': -1, 'x': -1} {'y': None, 'x': None}
-
循环遍历字典 (注意无序性!)
dic5 = {'name': 'hebw', 'age': 13, 'gender': 'male'} # 遍历key for key in dic5: print(key) # 遍历value for key in dic5: print(dic1[key]) 输出: gender age name male 13 hebw # 同时遍历key和value dict2 = {'a': 1, 'b': 2, 'c': 3} big = dict2.items() for k, v in big: print(k) print(v) 输出: a 1 c 3 b 2
-
添加键值对
dic5 = {'name': 'hebw', 'age': 13, 'gender': 'male'} dic5['tel'] = '13100000000' print(dic5) 输出: {'gender': 'male', 'age': 13, 'tel': '13100000000', 'name': 'hebw'}
-
删除键值对
# del()删除key对应的键值对 dic5 = {'gender': 'male', 'age': 13, 'tel': '13100000000', 'name': 'hebw'} del (dic5['tel']) # pop()删除key对应的键值对,并且返回该值 dic5 = {'gender': 'male', 'age': 13, 'tel': '13100000000', 'name': 'hebw'} tel = dic5.pop("tel") print(dic5) print(tel)
-
修改值
dic5 = {'name': 'hebw', 'age': 13, 'gender': 'male'} dic5['name'] = 'HEBW' print(dic5) 输出: dic5 = {'name': 'hebw', 'age': 13, 'gender': 'male'}
-
清空字典
dic5 = {'name': 'hebw', 'age': 13, 'gender': 'male'} dic5.clear()
-
判空
dic5 = {'name': 'hebw', 'age': 13, 'gender': 'male'} print("HEBW" in dic5) print("age" in dic5) 输出: False True
-
删除整个字典
dic5 = {'name': 'hebw', 'age': 13, 'gender': 'male'} del (dic5) print(dic5) 输出: 会报错,提示dic5未定义
-
根据key获取value
# 如果存在则返回,不存在返回指定的值或none dic = {0: 0, 1: 1, 2: 2} print(dic.get(13)) print(dic.get(1, "error")) 输出: None 1
-
获取字典中键(key)的列表
dic = {0: 0, 1: 1, 2: 2} print(dic.keys()) 输出: [0, 1, 2]
-
获取字典中值(value)的列表
dic = {0: 0, 1: 1, 2: 2} print(dic.values()) 输出: [0, 1, 2]
-
获取键值对元组的列表
dic = {0: 0, 1: 1, 2: 2} print(dic.items()) 输出: [(0, 0), (1, 1), (2, 2)]
序列类型基本操作
索引:
序列类型容器里的元素存在索引,第一个是从0开始往后递增,
索引分正负,如下:
s = abcde
a b c d e
0 1 2 3 4
-5-4-3-2-1
print(s[0] + s[1])
print(s[-1] + s[-2])
输出:
ab
ed
切片:
顾名思义,截取序列数据中的一部分内容
# ----切片 [开始:结束:间隔默认为1,有调整切片方向的作用] 默认从左向右切片
# ----切片 正索引
print(s[0:1])
print(s[:4])
print(s[2:])
print(s[2::2])
输出:
a
abcd
cde
ce
# ----切片 负索引
print(s[-1])
print(s[-1:])
print(s[-1::-1])
print(s[-4:-1])
print(s[-1:-4:-1])
print(s[-2:-5:-1])
输出:
e
e
edcba
bcd
edc
dcb
长度:
str = 'abcde'
print(len(str))
输出:
5
连接:
str = 'abcde'
str2 = '12345'
print(str + str2)
输出:
abcde12345
重复:
str2 = '12345'
print(str2 * 5)
输出:
1234512345123451234512345
存在判断:
str2 = '12345'
print('1' in str2)
输出:
True
最大值:
str = 'abcde'
str2 = '12345'
print(max(str))
print(max(str2))
输出:
e
5
最小值:
str = 'abcde'
str2 = '12345'
print(min(str))
print(min(str2))
输出:
a
1
比较: 这个有点不懂?
str = 'abcde'
str2 = '12345'
print(cmp(str, str2))
print(cmp(str, str))
输出:
1
0
遍历
list = [1, 2, 3, 4, 5, 6, 7]
str = 'hello'
# 取出序列的值
for x in list:
print(x)
for x in str:
print(x)
输出:
1
2
3
4
5
6
7
h
e
l
l
o
# 取出序列的索引
list = [1, 2, 3, 4, 5, 6, 7]
for x in range(len(list)):
print(x)
输出:
0
1
2
3
4
5
6
流程控制语句
基本使用
# 两种结果
a = 15
if a > 124:
print('a > 124')
print('True')
else:
print('a < 124')
print('False')
输出:
a < 124
False
# 三种结果
a = 15
if a > 124:
print('a > 124')
print('ok')
elif a == 124:
print("a == 124")
else:
print('a < 124')
print('false')
逻辑值
True 表示非空的量
False 表示0 NONE 空的量等
循环控制语句
else
# 循环正常结束后调用
s = 'hello'
for k in s:
print(k)
else:
print("ending")
输出:
h
e
l
l
o
ending
break
# 打断此层的循环
for k in s:
print(k)
if k == 'l':
break;
else:
print("ending")
输出:
h
e
l
continue
# 跳过循环的后续代码块
for k in s:
if k == 'l':
continue;
print(k)
else:
print("ending")
输出:
h
e
o
ending
return
# 跳出循环结束函数返回数值
def ret():
for x in 'hello':
print(x)
if x == 'e':
return 1
print('666')
else:
print('-----ending')
a = ret()
print(a)
输出:
e
1
while循环
# 基本使用
x = ''
while x != 'q':
print(True)
x = input('请输入q结束循环:')
if not x:
break;
if x == 'c':
print('one more time~~c')
else:
print('ending')
函数
设置默认参数
def fa(name="hebw", age=0):
print('name:%s' % name + ' age:%s' % age)
fa()
输出:
name:hebw age:0
直接向函数传入元组
# 类似这样的函数,形式参数类似一个元组
def f(x, y):
print x, y
# 这里有一个元组,如何把元组直接传入方法内.分别当做x,y
t = (1, 2)
# 这里使用这个方法来直接传入一个元组 利用一个*号
f(*t)
直接向函数传入字典
def fa(name="hebw", age=0):
print('name:%s' % name + ' age:%s' % age)
fa(**{'age': 123, 'name': 'hbwwww'})
输出:
name:hbwwww age:123
冗余参数的接收
# 使用元组接收冗余参数
def f2(x, *args):
print(x)
print(args)
f2(2, 1)
输出:
2
(1,)
# 使用字典接收冗余参数
def f3(x, **args):
print(x)
print(args)
f3(1)
f3(1, y=1)
输出:
1
{}
1
{'y': 1}
lambda匿名函数
# 普通函数
def lam(x, y):
return x + y
a = lam(x=1, y=2)
b = lam(*(3, 7))
print(a)
print(b)
输出:
3
10
# lambda函数
def l(x, y):
return x * y
g = lambda x, y: x * y
print(type(g))
print(id(g))
print(g)
print(g(2, 2))
输出:
39222184
at 0x0000000002567BA8>
4
# lambda用法举例
l = range(1, 6)
def fa(x, y):
return x * y
a = reduce(fa, l)
c = reduce(lambda x, y: x * y, l)
print(a)
print(c)
输出:
120
120
switch场景,python不存在switch关键字,可以使用字典替代
# 举例 设计一个计算器
# 计算器
def add(x, y):
return x + y
def jian(x, y):
return x - y
def cheng(x, y):
return x * y
def chu(x, y):
return x / y
# 用if 和 else 写的代码
def operator(x, o, y):
if o == "+":
return add(x, y)
elif o == '-':
return jian(x, y)
elif o == '*':
return cheng(x, y)
elif o == '/':
return chu(x, y)
else:
pass
print(operator(6, '+', 6))
输出:
12
# 用字典的方法
oper = {"+": lambda x, y: x + y, "-": lambda x, y: x - y, "*": lambda x, y: x * y,
'/': lambda x, y: x / y}
def fc(x, o, y):
print(oper.get(o)(x, y))
fc(12, '/', 2)
输出:
6
# 总结:
# {}.get('o')('1', '2')
# 前面的{}代表字典,利用get方法,获取字典对应的value,value可以是一个lambda方法,同时可以直接在后传入方法的参数
内置函数
abs() 返回数字的绝对值
a = abs(-10111111)
print(a)
print(type(a))
输出:
10111111
max()最大 min()最小
l = [1, 23, 4, 5, 6, 7, 8, 9, 0, 1, 3, 23, 2, 2, 31, 5, 7, 89, 34, 23, 'sd']
print(max(l))
print(min(l))
输出:
sd
0
divmod() 返回包含两个数字的商和余的元组
print(divmod(2, 5))
输出:
(0,2)
pow(x, y[, z]) 函数是计算x的y次方,如果z在存在,则再对结果进行取模,其结果等效于pow(x,y) %z
print(pow(2, 3, 4))
输出:
0
round() 四舍五入
print(round(12.4))
输出:
12.0
callable() 检测函数是否可以被调用
print(callable(round))
输出:
True
isinstance() 判断对象是否属于某类型
l2 = {1: 1, 2: 2}
print(isinstance(l2, tuple))
输出:
False
cmp() 判断两个字符串是否一样
print(cmp('1', '1'))
print(cmp('1', '2'))
print(cmp('2', '1'))
输出:
0
-1
1
xrange()相比range(),就说是效率高一点,具体用处不明啊
类型转换
print(type(int(123)))
print(type(long(123)))
print(type(float(123)))
print(type(tuple([1, 2])))
print(type(list((1,))))
print(type(str(1)))
输出: