pythond的执行原理_Python学习笔记之入门(第二篇)

1、第一个Python代码

在Linux下/home/zx 目录下新建hello.py文件

1 #vim hello.py //添加如下内容2

3 #!/usr/bin/env python4

5 # -*- coding:utf-8 -*-6 print "Hello,World"7

8 #chmod +x hello.py //添加执行权限

执行代码:

./hello.py

结果:

842496-20151211154634777-856772330.png

python内部执行过程如下:

python首先把hello.py文件读到内存当中,然后经过语法分析和词法分析之后,假如文本没有问题会把文本的内容交给编译器,编译器会把文本的内容编译成字节码,然后执行字节码,把字节码转换成机器码,在进行CPU调度。

2、注释

当行注视:# 被注释内容

多行注释:""" 被注释内容 """ 或者 '''被注释内容'''。

3、导入模块

import sys //导入sys模块

4、捕获参数

捕获参数,并存入到集合

import sys.argv

比如:test内容如下:

1 #vim test.py2

3 #!/usr/bin/env python4 # -*- coding:utf-8 -*-5 import sys6 print sys.argv

执行代码:

zx@ubuntu:~$ ./test.py localhost:8001

执行结果:

['./test.py', 'localhost:8001']

5、python编译:

经过编译成字节码文件 .pyc文件,反编译成 .py;如果.pyc 和 .py 内容相同,

则.pyc 优先级高,否则,先查找.py,再重新编译生成 .pyc 文件。

6、变量

1)声明变量:

name = "tom"

上述代码声明了一个变量,变量名为:name,变量name的值为:"tom"

变量的作用:昵称,其代指内存里某个地址中保存的内容。

变量命名规则:

1)变量名只能以 数字、字母、下划线组成

2)第一个字符只能为字母、下划线;不能为数字

3)不要使用内置变量名

4)以下关键字不能声明为变量名

['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)变量赋值

比如:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

name1 = "tom"

name2 = name1

name1 = "Jerry"

print "name1:",name1 //打印name1值

print "name2:",name2 //打印name2值

执行结果:

zx@ubuntu:~$ ./name1.py

name1: Jerry

name2: tom

为什么name2值不等于Jerry?

答:1)在执行name1 = "tom",解释器创建了字符串"tom"和变量name1,并把name1指向"tom"。

2)执行name2 = name1,解释器创建了变量name2,并把name2指向name1指向的字符串"tom"。

3)执行name1 = "Jerry",解释器创建了字符串"Jerry",并把name1的指向改为"Jerry",但name2并没有更改。

所以,最后打印变量name2的结果自然是"tom"了。

字符串特性:一旦修改,重新创建

以下是分配两块地址池的:

num1 = 7

num2 = 7

id(num1),id(num2) 指针地址一样,同一块内存指针池(看起来一样,是内部进行优化的,相当于在内部循环了一遍,当循环了一遍之后,发现有一个id1也是这个地址,于是也将id2指向这个地址,实际上是开辟两块指针空间的)

如果缓冲池过大,就会新开辟一块空间,缓冲池就会将多的扔掉

num1 = 700

num2 = 700

id(num1),id(num2) 指针地址不一样

7、输出和输入 -->以下代码在Windows上实现的。

输出:

用print加上字符串,就可以向屏幕上输出指定的文字。比如输出“Hello,world”,用代码实现如下:

>>> print "Hello,world"

Hello,world

>>>

print语句也可以跟上多个字符串,用逗号","会输出一个空格,因此,输出的字符串是这样的拼起来的:

>>> print 'My favorite fruit is','apple','banana','pear'

My favorite fruit is apple banana pear

>>>

输入:

如果要让用户从电脑输入一些字符,python提供了raw_input函数和getpass模块,可以让用户输入字符串,并存放到一个变量里。比如输入用户名和密码:

例如:

# -*- coding: utf-8 -*-

import getpass

name = raw_input("请输入用户名:".decode('utf-8').encode('gbk'))

pwd = getpass.getpass()

print name

print pwd

8、流程控制-->以下代码都在Windows下实现的。

需求1:判断用户名是否等于“tom”,打印“登录成功”,否则,打印“登录失败”。

# -*- coding: utf-8 -*-

name = raw_input("请输入用户名:".decode('utf-8').encode('gbk')) //输入tom

if name == "tom": //值对比,内存地址对比,

print u"登录成功"

else:

print u"登录失败"

需求2:如果用户输入用户是"tom",就打印"普通用户";如果用户输入用户是"jerry",就打印"管理员";如果用户输入用户是"jack",就打印"超级管理员";否则,打印"输入有误"。

代码如下:

# -*- coding: utf-8 -*-

name == raw_input("请输入用户名:".decode('utf-8').encode('gbk')) //这里进行编码转换,否则不能正常显示中文。

if name == "tom":

print u"普通用户" //正常打印中文需要加上'u'

else if name == "jerry":

print u"管理员"

else if name == "jack":

print u"超级管理员"

else:

print u"输入有误"

需求3:做一个登录测试,如果输入用户名是"tom",并且密码等于"123",就打印"登录成功",否则,"登入失败"。

# -*- coding: utf-8 -*-

import getpass

name = raw_input("请输入用户名:".decode('utf-8').encode('gbk'))

pwd = getpass.getpass()

if name == "tom" and pwd == "123":

print u"登入成功"

else:

print u"登录失败"

9、数据类型

数据类型总体分为两部分:

1)、单值

数字:整型、长整型、浮点型、复数

布尔值:真或假,1或0

字符串:"Hello,world"

2)、集合

列表、元组、字典、哈希表

1)、int(整型)

在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647

在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807

2)、长整型

跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。

注意:自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。

3)、浮点型

浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。

4)、复数

复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。

注:Python中存在小数字池:-5 ~ 257

5)、布尔值

真或假

1 或 0

6)字符串

万恶的字符串拼接:

python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。

a.字符串格式化

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

>>> 'Hello,%s' %'world'

'Hello,world'

>>> 'Hi,%s,you have $%d' %('Mechael',1000)

'Hi,Mechael,you have $1000'

>>>

常见的占位符有:

%d 整数

%f 浮点数

%s 字符串

b.打印字符串

>>> print 'tom' #使用单引号

tom

>>> print "tom" #使用双引号

tom

>>> print '''line1 #使用3个引号,可以是3个双引号或者单引号

... line2

... line3

... line4'''

line1

line2

line3

line4

>>>

c.字符串切片

>>> name = "jerry"

>>> name[0] #打印索引为0的值,输出值为:j

'j'

>>> name[0:2] #打印索引从0到2的值,不包括2(即<),输出值为:je

'je'

>>> name[-1] #打印最后一个,输出值为:y

'y'

>>> name[:-1] #打印索引从0开始至倒数第二字符,不包括自己,输出值为:jerr

'jerr'

d.统计长度

>>> len(name) #统计字符串长度

5

e.去除两边的字符

>>> name = " jerry "

>>> name.strip() #去除两边空格

'jerry'

>>> name.lstrip() #去除左边空格

'jerry '

>>> name.rstrip() #去除右边空格

' jerry'

>>>

f.分割

>>> name = "tom,25,man"

>>> name.split(',')

['tom', '25', 'man']

10、列表(list)

Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。

1)创建列表:

name_list = ['tom','jerry','jack']

2)获取list元素的个数

>>> len(name_list)

3

3)用索引来访问list中每一个位置的元素

>>> name_list[0]

'tom'

>>> name_list[1]

'jerry'

>>> name_list[2]

'jack'

>>> name_list[-1]

'jack'

>>>

4)往list追加元素到末尾

>>> name_list.append('Adam')

>>> name_list

['tom', 'jerry', 'jack', 'Adam']

>>>

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

>>> name_list.insert(1,'Bob')

>>> name_list

['tom', 'Bob', 'jerry', 'jack', 'Adam']

>>>

6)删除lsit末尾的元素,用pop()方法

>>> name_list.pop()

'Adam'

>>> name_list

['tom', 'Bob', 'jerry', 'jack']

>>>

7)要删除指定位置的元素,用pop(i)方法,其中i是索引位置:

>>> name_list.pop(1)

'Bob'

>>> name_list

['tom', 'jerry', 'jack']

>>>

8)把某个元素替换成别的元素

>>> name_list[1] = 'Tracy'

>>> name_list

['tom', 'Tracy', 'jack']

>>>

9)join (列表变成字符串)

>>> ','.join(name_list)

'tom,Tracy,jack'

10)in(包含,判断元素是否在列表中)

>>> 'tom' in name_list

True

>>>

11、元组(没有增删改),其他和列表一样

>>> name_list = ('tom','Jerry','jack')

>>> name_list

('tom', 'Jerry', 'jack')

总结:

列表(list),字符串(str),元组(tuple)

共同点: 切片、索引、len() 、in

不同点:

str:重新开辟空间

list:修改后,不变

元组(tuple): 不允许修改

12、for循环

# -*- coding: utf-8 -*-

name_list = ['tom','jerry','jack']

for item in name_list:

if item == 'tom':

print "How are you"

continue #结束当前循环

if item == 'jerry':

print "hello"

break #跳出循环

13、while循环

while 条件:

print "..."

while True: #死循环

print "True"

14、字典,键值对(字典无序,特殊的for循环)

字典:由key和value存储方式

# -*- coding: utf-8 -*-

person = {"name":"tom","age":25,"gender":"man"}

print person.keys()

print person.values()

print person['name']

for keys,values in person.items():

print keys,values

print "############"

执行结果:

F:\code>python person.py

['gender', 'age', 'name']

['man', 25, 'tom']

tom

gender man

############

age 25

############

name tom

############

说明:

person.keys() #所有key,得到列表

person.values() #所有value,得到列表

person.items() #所有元素,仅for循环时使用。

15、运算符

1)算术运算符:+:加-:减*:乘/:除%:取模,20%10输出结果0**:幂//:取整除-返回商的整数部分,9//2输出结果4、9.0//2.0输出结果4.0

2)比较运算符==:等于-比较对象是否相等!=:不等于-比较两个对象是否不相等<>:不等于-比较两个对象是否不相等>:大于-返回x是否大于y<:小于>=:大于等于<=:小于等于3)赋值运算符=:简单的赋值运算符+=:加法赋值运算符-=:减法赋值运算符*=:乘法赋值运算符/=:除法赋值运算符%=:取模赋值运算符,c%10等效于c=c%10

**=:幂赋值运算符//=:取整数赋值运算符

4)位运算符&:按位与运算符|:按位或运算符^:按位异或运算符~:按位取反运算符<<:左移动运算符>>:有右移动运算符5)逻辑运算符

and:布尔与

or:布尔或

not:布尔非6)成员运算符in:如果在指定的序列中找到值返回True,否则返回False。

notin:如果在指定的序列中没有找到值返回True,否则返回False。7)身份运算符is:is是判断两个标识符是不是引用自一个对象is not:is not是判断两个标识符是不是引用自不同对象

16、文件操作

打开文件:

file_obj = file("文件路径","模式")

或者

file_list = open('文件路径','模式')打开文件模式有:r,以只读方式打开文件

r+,打开一个文件用于读写。文件指针将会放在文件的开头

w,打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

a,打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

w+,打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

#找到文件

文件路径 E:/log.txt

#打开文件

file_obj = file(文件路径,'r')

#文件操作,读写

file_obj.read() //将所有读入到内存

file_obj.readlines() //一行一行读入到内存

for line in file_obj.xreadlines()

print line

上面改成下面的:

for line in file_obj: //每次循环,只读一行,避免全部读入内存

file_obj.write() //写

file_obj.writeline() //一行一行写

#文件关闭

file_obj.close()

需求:将用户每登陆一次,记录一次登陆次数(通过操作文件实现)

log.txt文件内容格式如下:

tom;123;1

jack;456;2

代码如下:

# -*- coding: utf-8 -*-

file_obj = file('F:\code\day1\log.txt','r+')

line_list = file_obj.readlines()

#print line_list -->打印结果:['tom;123;1\n', 'jack;456;2']

my_list = [] //定义一个空列表

for ele in line_list:

#print ele -->打印结果: tom;123;1

# jack;456;2

line = ele.strip() //把\n删掉

#print line -->打印结果:tom;123;1

# jack;456;2

value_list = line.split(';') //分割后,转换成列表。

#print value_list -->打印结果:['tom', '123', '1']

# ['jack', '456', '2']

last_value = int(value_list[-1]) //把最后一个值转换成整数

#最后一个数,转换成整型

#print last_value -->打印结果:1 和 2

#print type(last_value) -->打印结果:last_value += 1 //将最后一个值加‘1’

#print last_value

value_list[-1] = str(last_value)

#更新后的列表

#print value_list -->打印结果: ['tom', '123', '2']

# ['jack', '456', '3']

value_str = ';'.join(value_list)

#将列表转换成字符串

#print value_str -->打印结果:tom;123;1

# jack;456;2

my_list.append(value_str)

#print my_list -->打印结果:['tom;123;2', 'jack;456;3']

file_obj.seek(0) //

my_str = '\n'.join(my_list) //添加\n

#print my_str

file_obj.write(my_str)

file_obj.close()

执行结果:

tom;123;2

jack;456;3

提示:seek():移动文件指针到不同的位置,可以指定偏移量和起始位置。起始位置0表示从文件头开始,1表示从当前位置开始,2表示从文件尾开始,默认是0.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值