Python学习笔记之入门(第二篇)

允我心安 提交于 2020-02-13 05:31:29

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)字符串

万恶的字符串拼接:

  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。
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.

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!