1、第一个Python代码
在Linux下/home/zx 目录下新建hello.py文件
1 #vim hello.py //添加如下内容 2 3 #!/usr/bin/env python 4 5 # -*- coding:utf-8 -*- 6 print "Hello,World" 7 8 #chmod +x hello.py //添加执行权限
执行代码:
./hello.py
结果:
python内部执行过程如下:
python首先把hello.py文件读到内存当中,然后经过语法分析和词法分析之后,假如文本没有问题会把文本的内容交给编译器,编译器会把文本的内容编译成字节码,然后执行字节码,把字节码转换成机器码,在进行CPU调度。
2、注释
当行注视:# 被注释内容
多行注释:""" 被注释内容 """ 或者 '''被注释内容'''。
3、导入模块
import sys //导入sys模块
4、捕获参数
捕获参数,并存入到集合
import sys.argv
比如:test内容如下:
1 #vim test.py 2 3 #!/usr/bin/env python 4 # -*- coding:utf-8 -*- 5 import sys 6 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)字符串
万恶的字符串拼接:
>>> '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。 not in:如果在指定的序列中没有找到值返回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) -->打印结果: <type 'int'> 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.
来源:https://www.cnblogs.com/zengxin101/p/5039399.html