六.Python字节码
新建一个m.py内容如下
#!/usr/bin/python
# -*- cofing:utf-8 -*-
print "hello liuyueming"
编辑hello.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#print "你好,世界"
#import sys
#print sys.argv
#字节码
import m
print "hello"
执行python hello.py
输出为
hello liuyueming
hello
在文件夹下面多了一个m.pyc文件
就是python的字节码,是经过编译形成的,vim查看是乱码的,m.pyc经过反编译还可以变回m.py
通过python也能执行字节码程序
已经生产字节码了把m.py删除掉还是可以正常执行hello.py 如果不是删除m.py而是把m.py修改在执行hello.py就会先调用m.py
就是说假如内容相同会优先执行m.pyc,内容不一样优先先执行m.py生成m.pyc然后再执行
七.变量
1,声明变量
name = "liuyueming"
声明了一个变量name内容为liuyueming
变量名的要求
.变量只能是字母,数字,下划线的组合
.变量名的第一个字符不能为数字
.以下关键字不能作为变量名
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
2,变量赋值
name1 = "zhangsan"
name2 = "wanglaowu"
操作
name1 = "liuyueming"
name2 = name1
name1 = "wanglaowu"
变量name1变成wanglaowu了 name2还是维持原有的liuyueming
PS:C语言,没字符串,但是有字符
hello -- 五个字符组成的
python是用字符数组伪造一个字符串 ['h','e','l','l','o']
#字符串特性,一旦修改,重新创建,重新开辟空间。字符串越多内存占用空间越多。
操作
name1 = 'liuyueming'
name2 = 'liuyueming'
使用id查看内存中的地址
>>>id(name1)
140121677068832
>>> id(name2)
140121677068832
地址是一样的
在一定内容范围内指向是相同的 超过一定范围内指向就不一样的,这是Python的一个优化对重复的内容不用指定多个内存存储
有个缓冲池慢了就会释放
>>> i1 = 700
>>> i2 = 700
>>> id(i1),id(i2)
(18328424, 18328448)
在内存里面开辟了两块空间,避免小的字符串重复开辟新的内存空间。
Python执行过程
1,加载内存,词法分析,语法分析,编译--》字节码
2,ASCII,unicode,utf-8
八.输入输出
name = raw_input ("请输入用户名")
如果是密码不希望可见使用
import getpass
pwd = getpass.getpass(">>>")
pwd显示刚刚输入的密码
九.流程控制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
name = raw_input("请输入用户名:")
if name == 'liuyueming': #值对比,不是内存地址对比,is必须是内存地址也相等
print "登录成功"
else:
print "登录失败"
执行输入假如是输入liuyueming则提示登录成功否则输出登录失败
也可以多条件流程控制
name
=
raw_input
(
'请输入用户名:'
)
if
name
=
=
"alex"
:
print
"超级管理员"
elif
name
=
=
"eric"
:
print
"普通管理员"
elif
name
=
=
"tony"
:
print
"业务主管"
else
:
print
"普通用户"
name = raw_input("请输入用户名")
pwd = getpass.getpass("请输入密码")
if name == "alex" and pwd == "123":
print "登录成功"
else:
print "登录失败"
列表 元祖 字典 哈希表
操作
i = 123
print type(i)
<type 'int'>
j = True
print type(j)
<type 'bool'>
使用内置type可以查看字符类型
操作
字符串的格式化
>>>name = "alex"
>>> print "i am %s" %name
i am alex
如果是两个替换需要在后面使用%()里面按照顺序填写 注意字符串加引号
name = 'I am %s,age %d' % ('liuyueming',18)
>>> name
'I am liuyueming,age 18'
以上语法和以下类似
name = "I am %s ,age %d"
name %("liuyueming",18)
不同的是上面执行完name字符串是I am liuyueming 18 下面name字符串是I am %s %d因为格式化支行会生成一个new_name
另外一种格式化方式
>>> name = "I am {0},age{1}"
>>> name.format("liuyueming",18)
'I am liuyueming,age18'
>>> name
'I am {0},age{1}'
PS:Python有多种引用字符串的方式 单引号 '' 双引号"" 两个引号没有区别 还有三引号之间可以有多行。
操作
>>> name = 'liuyueming'
>>> name[0]
'l'
类似于shell的数组其实是一串使用0开始的下标可以输出,是一个字符数组
>>> name[0:4]
'liuy'
从第一个字符开始取字符但是不包括4就是0 1 2 3就是小于不是等于 不包含4
>>> name[0:]
'liuyueming'
直接取到结尾
>>> name[-1]
'g'
Python特殊的下标-1 取最后一个字符
>>> name[:-1]
'liuyuemin'
>>> name[-1]
'g'
>>> name[len(name)-1]
'g'
len是内置函数计算长度
>>> name = " liuyueming"
>>> name
' liuyueming'
使用 strip去掉空格 lstrip去掉左边空格rstrip去掉右边的空格
>>> print name.strip()
liuyueming
字符串列表
>>> name_list = ['zhangsan','lisi','wangmazi']
>>> name_list
['zhangsan', 'lisi', 'wangmazi']
同样是以[0...n]输出
字符串分割,使用,分割得到一个列表,使用其他字符分割得到另外一个列表
>>> name = "liuyueming,zhangshan"
>>> name.split(',')
['liuyueming', 'zhangshan']
字符串常用操作
.移除空白
.分割
.长度
.索引
.切片
字符串列表基本操作
.索引
.切片
.追加
.删除
.长度
.循环
.包含
操作
>>> id(name_list)
139985881722464
>>> name_list.append('seven')
>>> name_list
['zhangsan', 'lisi', 'wangmazi', 'seven']
>>> id(name_list)
139985881722464
追加一个列表在内存空间没有变化
所以如果定义了,修改了name_list 因为他们指向的是同一个内存空间所以name_list1会和name_list同步,这点和字符串定义是不一样的
name_list1 = name_list
删除一个
>>> del name_list[0]
>>> name_list
['lisi', 'wangmazi', 'seven']
使用len同样可以知道列表长度
分割字符串列表 使用_分割 分割以后就是一个字符串了
>>> "_".join(name_list)
'lisi_wangmazi_seven'
判断一个字符在字符串列表里面有没有
>>> "lisi" in name_list
True
返回一个布尔值 真假
元祖 列表以中括号[]元祖用() 区别是元祖不可修改其他特征一样
创建元祖
ages = ("liuyueming","zhangsan")
可以在列表里面创建元祖
但是列表里面的元祖数据是不能修改的,可以把列表里面的元祖删除或者添加元祖但是元祖里面的数据无法修改
切片,索引找值,是否包含,循环 等是共同特点
str
修改重新开辟空间
list
修改不重新开辟空间,内存地址不变
tuple
不允许修改
循环 for ele in name_list:
print ele
编辑find.py
name_list = ['alex','xiaoyueyue','qiangge']
for ele in name_list:
if ele == "xiaoyueyue":
print "find"
break
PS:注意格式及空格否则容易出现语法错误 break是退出整体循环continue是退出本次循环(和shell是一样的)
while循环
while True:
print 'true'
这是一个无限循环不停打印true
dict,字典,键值对
操作
#!/usr/bin/python
person = {
"name": 'liuyueming',
"age":18,
"gender":"1"
}
for ele in person:
print ele
执行
python person.py
gender
age
name
输出的只是key
修改源码
#!/usr/bin/python
person = {
"name": 'liuyueming',
"age":18,
"gender":"1"
}
for k,v in person.items():
print k
print v
使用items分别取输出为
python person.py
gender
1
age
18
name
liuyueming
PS:看起来好像是倒序出来的但是其实字典是无序输出的。只是字典自身的特性
person.keys() #所有的key
person.values()#所有valus
person.items()#所有元素
print person.keys()
print person.values()
输出为(保存为列表)
['gender', 'age', 'name']
['1', 18, 'liuyueming']
十一.运算
算数运算
+ 加
- 减
* 乘
/ 除 取商
%除 取余数
** 幂运算
比较运算
== 等于
!= 不等于
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
赋值运算
= 简单赋值运算
+= 加法赋值运算
-= 减法赋值运算
*= 乘法赋值运算
/= 除法赋值运算
逻辑运算
与或非 and or not
成员运算
in 包含
not in 不包含
身份运算
is
is not
位运算(用的比较少)
运算符的优先级