python学习之路-day2-pyth基础2

时间:2021-08-10 09:10:50

python学习之路-day2-python基础2

本节内容:

  • 第一个python程序
  • 字符编码简单介绍
  • 变量和格式化
  • 注释
  • 用户输入
  • 数据类型
  • 数据运算

一、第一个python程序

  注:文章中所有的程序都是使用pycharm执行的,请自行安装pycharm

  • 输出:

  python中使用print 打印想要输出的内容。

在pycharm中新建一个hello.py的文件
1 print("Hello World!")

  注:1、Python3中print打印的时候需要加小括号(),pyhton2中可加可不加

    2、print打印的时候如果打印想要输出的内容需要加双引号或者单引号“”,否则会按打印变量处理

  • 指定解释器

  1、如果是在Linux上面执行py文件可以直接指定解释器:

  python hello.py

  2、上一步中执行 python hello.py 时,明确的指出 hello.py 脚本由 python 解释器来执行。

    如果想要类似于执行shell脚本一样执行python脚本,例: ./hello.py ,那么就需要在 hello.py

    文件的头部指定解释器,如下:  

1 #!/usr/bin/env python
2
3 print ("hello,world")

二、字符编码简单介绍

python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill)

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1,所以,ASCII码最多只能表示 255 个符号。

python学习之路-day2-pyth基础2

python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill),如果是如下代码的话:

1 #!/usr/bin/env python
2
3 print ("你好,世界" )
报错:ascii码无法表示中文

改正:应该显示的告诉python解释器,用什么编码来执行源代码,即:

1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 print "你好,世界"

三、变量和格式化

  • 变量的定义规则
    • 变量名只能是 字母、数字或下划线的任意组合
    • 变量名的第一个字符不能是数字
    • 以下关键字不能声明为变量名
      【'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'】
  • 变量的赋值

  在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值

  例1:

1 name = "lw"   #变量赋值,后面要加双引号
1 name = "lw"
2
3 name2 = name
4 print(name,name2)
5
6 name = "Jack"
7 print(name,name2)

  :1、第一次输出:lw,lw

    第二次输出:jack,lw

    name2指向的是name这个变量的值而不是name

    2、赋值的含义:

      上面对name 赋值lw,实际上是将name这个变量指向lw的内存地址,name2 = name,也是将name2指向lw的内存地址,而后面的name = jack是建name指向jack的内存地址,name2指向的内存地址并没有变。

      举一个例子:将变量比作房间的标识(房间号),内存地址比作房间,name 指向的是lw这个房间,name2 指向的也是lw这个房间,后面讲name指向jack这个房间,但是name2的指向并没有变。

  python学习之路-day2-pyth基础2

python学习之路-day2-pyth基础2

  • 格式化输出
    • 打印 I am ok

    

print("I am ok")
I am ok
    • 如果需要打印的字符串中包含双引号:
print('"I am ok"')

"I am ok"
    • 如果需要打印的内容中既包含双引号又包含单引号,就需要用到转义   \
print('"I\'m ok"')  #对单引号'转义,\‘
"I'm ok"
    • 如果打印的内容中还包含\,一样是用\转义
print('"I \\ am ok"')

"I \ am ok"
    • 如果字符串里面有很多字符都需要转义,就需要加很多\,为了简化,Python还允许用r''表示''内部的字符串默认不转义:
print('\\\t\\')
\ \
print(r'\\\t\\')
\\\t\\
    • 如果内容里面有换行,可以使用\n
print('"I \\ am \n ok"')
"I \ am
ok"
    • 如果内容里面有很多换行,用\n就不方便了,Python允许用'''...'''的格式化内容输出:
print('''
line1
line2
line3
... ''')
输出:

line1
line2
line3
...

info = '''
this is a test
my name is lw
'''
print (info)

this is a test
my name is lw

  • %

  %也是一种格式化,用来替换字符串中的字符,%s表示用字符串替换,%d表示用整数替换,%f表示用浮点数替换,如果输入的替换内容的数据类型(后文中会提到)不正确的话将会报错。

print("this is %s test"%'lw')
输出:
this is lw test
===================
print("this is %s test %f"%('lw',123)) 输出:
this is lw test 123.000000
=====================
如果输出的内容中带%,需要转义,此时\就不管用了,%要用%来转义:
print("this %% is %s test %f"%('lw',123))
输出:
this % is lw test 123.000000

四、注释

  • 单行注释:#
  • 多行注释:''' ''' 如果代码中有'''作为格式化,可以使用"""  """
"""
print('''
line1
line2
line3
... ''')
info = '''
this is a test
my name is lw
''' """

 

五、用户输入

  • 有时需要用户输入一些信息,用变量接受用户输入的内容
1 name = input("please input your name")    #输入后赋值给name,接收的是字符串格式。如果输入的是数字,需要加int,name = int(input("please input your name"))
2 print("Hello " + name )
  • 密码的输入

    输入密码时,如果想要不可见,需要利用getpass 模块中的 getpass方法,即:

 1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 import getpass
5
6 # 将用户输入的内容赋值给 name 变量
7 pwd = getpass.getpass("请输入密码:")
8
9 # 打印输入的内容
10 print(pwd)

六、数据类型

1、整数

  Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,5,7,-8,-10,0,等等。

2、浮点数

  浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是完全相等的。浮点数可以用数学写法,如1.233.14-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。

3、布尔值

布尔值和布尔代数的表示完全一致,一个布尔值只有TrueFalse两种值,要么是True,要么是False,在Python中,可以直接用TrueFalse表示布尔值(请注意大小写),也可以通过布尔运算计算出来:

print(True)
print(False)
print(3>2)
print(3>3)
print(3>5) 输出:
True
False
True
False
False

布尔值可以用andornot运算。

and运算是与运算,只有所有都为Trueand运算结果才是True

or运算是或运算,只要其中有一个为Trueor运算结果就是True

not运算是非运算,它是一个单目运算符,把True变成FalseFalse变成True

4、空值

空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。

5、列表list

列表(list)是一种有序集合,列表使用中括号来定义【】

列表定义:

names = 【】定义一个空列表

names = [“lw”,”lw1”,”lw2”]   #有lw,lw1,lw2,3个元素的列表

使用索引来获取列表中的元素,索引从0开始,取第一个元素:

L = ["zhangsan","lisi","wangwu"]
print(L[0])
输出:
zhangsan
=======================
L = ["zhangsan","lisi","wangwu"]
print(L[0:2])#取第一个和第二个值(顾头不顾尾,取0,不取2)
输出:
['zhangsan', 'lisi']

也可以从后面开始取:

L = ["zhangsan","lisi","wangwu"]
print(L[-1])
输出:
wangwu
=================
同理,取倒数第二个,以此类推,可以取倒数第三个、第四个.....:
L = ["zhangsan","lisi","wangwu"]
print(L[-2])
输出:
lisi

1.列表追加----append

L = ["zhangsan","lisi","wangwu"]
L.append("lw") #插入到列表最后面
print(L)
输出:
['zhangsan', 'lisi', 'wangwu', 'lw']

2.插入

L.insert(1,“test”)  #插入到列表下面为1的位置。

3.修改

L = ["zhangsan","lisi","wangwu"]
L[1] = "lw"
print(L)
输出:
['zhangsan', 'lw', 'wangwu']

4.删除

1 L.remove(“lw”)  #直接跟值
2
3 del L[0] 删除列表中第一个值
4
5 L.pop() 不输入下标默认删除最后一个值

5.  统计

L = ["zhangsan","lisi","wangwu","lisi"]  
print(L.count("lisi")) #统计lisi在列表中有几个 输出:
2

6.      清空列表

names.clear()

7. 排序

names.sort()
a =  [1,2,3,4,4,4,4,4,4,4,2,2,2,2,2,3,3,3,3,3]
b = ["b","c","a"]
a.sort()
b.sort()
print(a,b)
注:数字和字母不能进行排序

8、获取下标

   
print(names.index("lisi"))
a =  [1,2,3,4,4,4,4,4,4,4,2,2,2,2,2,3,3,3,3,3]
b = ["b","c","a"]
a.sort()
b.sort()
print(a,b)
print(a.index(4)) 输出:

[1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4] ['a', 'b', 'c']
13     #注:列表中存在多个元素时,取第一个元素的下标,这里13是以为上面进行了排序

9、拷贝

深浅拷贝

如果希望将列表复制一份,通过列表的内置方法copy就可以实现:

1 s = [[1,2],3,4]
2 s1 = s.copy()
3 print(s)
4 print(s1)

拷贝出的列表s1与原列表s完全一致。

[[1, 2], 3, 4]
[[1, 2], 3, 4]

对s1修改:

python学习之路-day2-pyth基础2
1 s = [[1,2],3,4]
2 s1 = s.copy()
3 s1[1] = 'oliver'
4 s1[0][1] = 'hello'
5 print('列表s:',s)
6 print('列表s1:',s1)
python学习之路-day2-pyth基础2

输出:把列表s1中的元素3修改为'oliver'后,原列表并未受影响。

  将s1中第一个元素[1,2]中的2修改为'hello'时,原列表中也跟着变了。

列表s: [[1, 'hello'], 3, 4]
列表s1: [[1, 'hello'], 'oliver', 4]

问题来了,通过copy方法拷贝列表s得到列表s1,修改s1中的元素后,s中的元素有的没变,有的跟着变了。为什么会出现这种现象?s与s1之间有什么联系呢?二者的内存空间是否完全独立?

如下图所示,使用列表内置的copy方法,是将新列表中的元素指向了与原列表相同的内存空间。但是,如果列表中嵌套了列表,拷贝后的列表中嵌套的列表元素指针,指向原列表中嵌套列表的整体地址,而不是指向嵌套列表中元素的内存地址。

python学习之路-day2-pyth基础2

python学习之路-day2-pyth基础2

由此可得,s1[0][1]修改后,s列表中的该元素指针指向的内存空间也会发生改变。

这便是列表的浅拷贝。

如果希望拷贝后的列表拥有完全独立的内存空间,则需要一个新的方法深拷贝来实现:

python学习之路-day2-pyth基础2
1 import  copy
2 s = [[1,2],3,4]
3 s2 = copy.deepcopy(s)
4 s2[0][1] = 'abc'
5 print('列表s:',s)
6 print('列表s2:',s2)
python学习之路-day2-pyth基础2

使用copy.deepcopy()方法来拷贝列表,修改嵌套列表中的元素,原列表不受影响。

列表s: [[1, 2], 3, 4]
列表s2: [[1, 'abc'], 3, 4]

总结

1、浅拷贝只能拷贝最外层,修改内层则原列表和新列表都会变化。

2、深拷贝是指将原列表完全克隆一份新的。

10、扩展

11、切片-取多个元素

 七、数据运算

  • 算数运算

   python学习之路-day2-pyth基础2

print(2+3)
print(2*2)
print(9/3) 输出:
5
4
3.0
  • 比较运算

  python学习之路-day2-pyth基础2

  • 赋值运算

  python学习之路-day2-pyth基础2

  • 逻辑运算

python学习之路-day2-pyth基础2

  • 成员运算

python学习之路-day2-pyth基础2

  • 身份运算

python学习之路-day2-pyth基础2

  • 位运算

python学习之路-day2-pyth基础2

  • 运算符优先级

python学习之路-day2-pyth基础2

七、流程控制

  • 判断表达式if...else

   用户登录验证

#!/usr/bin/env python
#_*_coding:utf-8_*_
user = "lw"
print(type(user))
password = ""
a = '''
######################################################
### ###
######################################################
'''
def login():
print(a)
count = 0
while count < 3:
u = raw_input("请输入用户名:")
p = raw_input("请输入密码")
if u == user and p == password:
print("login success!")
break
else:
print("user or password error,login failed!,please login again")
count +=1
continue
login()

猜年龄

  • 循环表达式for...else

  for循环和if判断一样,先执行for循环语句,循环体的else分支触发条件是循环正常结束。如果循环内被break跳出,就不执行else。所以这个逻辑是:如果循环内break了,不触发else,则执行下一句外层循环中的break;如果正常结束,执行else分支里的continue,直接跳转到外层循环的下一轮,跳过了第二个break。

    • 循环表达式while...else

三、  列表

四、元组

元组和列表一样,但是元组一旦创建就不能在修改

元组只有2个方法,一个是count,一个是index,完毕。

五、字典

字典的特性:

  • dict是无序的
  • key必须是唯一的,天生去重

六、字符串的操作

1.操作大集合

 name = "my name is lw age"
print(name.capitalize())
print(name.count("a")) #字符串出现的次数
print(name.center(50,"-")) #一共打印50个字符,不足的用“-”补充,name的变量居中
print(name.endswith("ex")) #是否以ex结尾,是输出true
print(name.find("name"))
#print(format(name='lw',age=23))
print('1A'.isdigit()) #是否是个正数
print('A1'.isidentifier()) #判断是否是一个合法的变量名
print('+'.join(['','',''])) #输出1+2+3
print(name.ljust(50,'*'))
print(name.rjust(50,'*'))
print('lw'.lstrip()) #去掉左边的空格或者回车
print('lw'.rstrip()) #去掉左边的空格或者回车
print('lw'.strip()) #全部空格或者回车
-----------
p = str.maketrans("abcd","")
print("adlw cx".translate(p)) #将adlw cx根据p(abcd --- 1234的对应关系替换
------------------------
print('alex li'.replace('l','L','')) #l替换成L,只替换1个
print('alex li'.split()) #默认以空格分隔成列表