Hugenye的个人博客

Python学习

字数统计: 3.6k阅读时长: 16 min
2019/09/24 Share

Python简介

python跨平台,python应用范围广(操作系统、web平台、3d动画、企业应用、云计算)

学习参考

python有很多BIF内置函数(dir(builtins)查看python中所用BIF)

1
2
>>> dir(__builtins__)  纯小写的是内置函数
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

Python的安装(免安装版)

1、在官网下载地址,下载windows系统 下的zip安装包

2、解压安装在c盘

3、启动python

1
2
3
>cd C:\python37 
>python
Python 3. 7.4 (tags/v3. 7. 4:e09359112e, Jul 8 2019, 20:34:20) CMSC v. 1916 64 bit (kWD64)) on win32

4、配置python环境变量

A.右键点击“我的电脑”,点击“属性”;

B.在弹出的界面中点击“高级系统设置”

C.在弹出的界面中点击“环境变量”;

D.在弹出的页面中进行环境变量的配置;

Idea下Python开发平台的搭建

\1. python的下载

https://www.python.org/downloads/

\2. idea下python插件的安装

点击File->Settings…->Plugins,在里面搜索python。

发现搜索并没有结果。我们点击search in repositories链接

\3. idea下的配置

File->New->Project,可以看到左边的项目类型中多了一个python。点击它

基础入门

变量和字符串

定义变量需要注意:

  • 在使用变量之前,需要对其先赋值
  • 变量名可以包括字母、数字、下划线,但是变量名不能以数字开头。
  • 字母可以是大写或着小写,但是大小写是不同的。也就是说hu和Hu对于python来说是完全不同的两个名字
  • 变量命名理论上是可以取任何合法的名字。但是尽量给变量取一个专业一点的名字

字符串

如果字符串出现单引号(’)或双引号(“)怎么办?

1.利用转义符号()对字符串中的引号进行转义;

1
print('I\'m Jane')  打印出I'm Jane

如果遇到要打印路径之类的比如C:\note,需要反斜杠对自身进行转义

但是如果对于一个字符串中有很多个反斜杠,可以使用原始字符串比如str=r’C:\note’

长字符串

如果想要得到一个跨域多行的字符串,就需要三重引号(’‘’)字符串

###Python的数据类型

‘数字’和数字代表不同的意义

整型(在版本3.0后和长整型表示一致)

浮点型(有小数点是浮点型,没有小数点是整型)

1
2
3
print(15e10)   #150000000000.0 
print(0.0000000001) #1e-10
e代表10的含义,小数点左边是正数,右边是负数

布尔类型(可以当作整数看待)

类型转换

1
2
3
4
5
6
b=int('340') #340
c=int('我的') #ValueError: invalid literal for int() with base 10: '我的'

f=5.59
f=int(f)
print(f) #5 浮点数转型为整型,python采取截断处理,效率高

获取关于数据的类型的信息(type()、isinstance())

1
2
3
print( isinstance('字符串', str)) #True
print( isinstance(1,int)) #True
print( isinstance(2.0,float)) #True

注意:TypeError: isinstance() arg 2 must be a type or tuple of types,对str进行了赋值,导致了字符串这个字符串比较的时候报错

常用操作符

算术操作符大部分和c语言一致

**是幂运算操作符 3**2实际上是3^2

比较操符

逻辑操作符(and or not)

1
2
3
4
not 0 # True  0代表false
not 3# False
例外 只用python可以执行的语句
3<4<5 #True

分支和循环

elif 是else if的缩写

条件表达式(三元操作符)

1
语法: x if 条件 else y

断言 assert

当assert这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionError的异常

1
assert 3>4

一般用来在程序中置入检查点,当需要确保程序中的某个条件一定为真才能让程序正常工作。

while循环

1
2
while 条件:
循环体

for循环(与c不太一样,更强大)

1
2
3
4
5
6
7
8
9
for 目标 in 表达式    
循环体
range([start],stop,[step])
for i in range(5):# 0 1 2 3 4
print(i)
for j in range(1,3): # 1 2
print(j)
for m in range(1,10,2):# 1 3 5 7 9
print(m)

序列

列表、元组和字符串的共同点

  • 都可以通过索引得到每一个元素
  • 默认所引致总是从0开始
  • 可以通过分片的方法得到一个范围内的元素的集合
  • 有很多共同的操作符(重读操作符、拼接操作符、成员关系操作符)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
list()# [] 空列表  将对象转为列表
list("www.baidu.com")
# ['w', 'w', 'w', '.', 'b', 'a', 'i', 'd', 'u', '.', 'c', 'o', 'm']
list((1,2,3,4)) #[1, 2, 3, 4]
tuple() 将可迭代对象转换为元组
tuple("www.baidu.com")
#('w', 'w', 'w', '.', 'b', 'a', 'i', 'd', 'u', '.', 'c', 'o', 'm')
str()转化为字符串
len("www.baidu.com") #13
max()/min() 要保证数据类型是统一的
sum((2.3,3.2,4),3) #12.5 =>(2.3+3.2+4)+3
sorted((5,2,3,4,1)) #[1, 2, 3, 4, 5]
list(reversed((5,2,3,4,1))) #[1, 4, 3, 2, 5]
list(enumerate((5,2,3,4,1))) #[(0, 5), (1, 2), (2, 3), (3, 4), (4, 1)]
list(zip([1,2,3],[4,5,6])) #[(1, 4), (2, 5), (3, 6)]

列表

创建列表

创建一个普通列表

1
2
members=['字符串1''字符串2''字符串3']
number=[1,2,3,5]

创建一个混合列表

1
mix=[1,'字符串1',3.2,[1,2,3]]

创建一个空列表

1
number=[]
向列表列表添加元素
1
2
3
4
mix=[1,'字符串1',3.2,[1,2,3]]
mix.append('添加数据')
mix.extend(['字符串1',22,1.2])#extend必须添加对象的是列表
mix.insert(1,'插在第二位')
从列表中获取元素
1
mix[0] #1
从列表中删除元素
1
2
3
4
5
6
7
8
9
10
11
12
13
mix=[1,'字符串1',3.2,[1,2,3,'数组二的元素']]
mix.remove(22) #要删除的内容 remove('字符串')
del mix[0] #也可以删除整个数组
mix.pop() #移除最后的一个元素并返回删除元素的值
'''
[1, 2, 3, '数组二的元素']
[1, '字符串1', 3.2]
'''
mix.pop(1)
'''
字符串1
[1, 3.2, [1, 2, 3, '数组二的元素']]
'''
列表分片slice
1
2
3
print(mix[1:3])#['字符串1', 3.2]
print(mix[:3])#[1, '字符串1', 3.2]
print(mix[:])#列表的拷贝
列表的一些常用操作符

可以比较大小,但是比较的列表内容是以数组第一个元素进行比较;

列表组合可以用+号连接,但是不能连接一个字符串等数据;

列表*次数,列表原有数据增加了次数的几个元素

列表类型内置函数
1
2
3
4
5
6
7
8
9
10
dir(list)
'''
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

'''
list3=[110,22,33,110]
list3.count(110) # 2
list3.index(110) #0
list3.sort()#从小到大排序
list3.sort(reverse=True)#逆序

元组

元组和列表的不同:

元组内容是不能被修改的

1
2
3
4
5
6
7
8
9
10
11
12
temp=()#空的元组
temp=(1,3,4)或者1,34 #元组
(3)不是元组是个整型元素
8*(8) 是64
8*(8,)是(8,8,8,8,8,8,8,8)

temp=("组1","数2","word")
temp=temp[:1]+("插入值",23.6,)+temp[1:]
#('组1', '插入值', 23.6, '数2', 'word')
新的temp生成,旧的temp会被回收器回收

del temp #删除整个元组

字符串

奇葩的内置方法

字符串的方法与注释

格式化
1
2
3
4
'{0} love {1}.{2}'.format('I','baidu','com')
#I love baidu.com
'{a} love {b}.{c}'.format(a='I',b='baidu',c='com')
'{0} love {b}.{c}'.format('I',b='baidu',c='com')
1
2
3
4
5
'{0:.1f}{1}'.format(27.698,'GB')
#27.7GB
:表示格式化符号的开始
.1 四舍五入保留一位小数点
f定点数
1
2
格式化符号
'%c %c %c' % (97,98,99)#a b c

函数

实参和形参

1
2
3
4
5
6
7
8
9
10
11
def fun1():
print("fun1")
fun1()# fun1()

def fun2(num1,num2):#num1,num2是形参
return num1+num2
print(fun2(2,3))#2,3是实参

def fun3(name):
print("参数是:"+name)
fun3("数值")

关键字参数

1
2
3
4
5
def sayWord(name,words):
print(name+"->"+words)

sayWord(words="Hello",name="小明")#words= ,name= 关键字参数
小明->Hello

默认参数

1
2
3
4
5
6
7
def sayWord(name='小白',words='世界和平'):
print(name+"->"+words)
sayWord()#小白->世界和平

def sayWord(name='小白',words='世界和平'):
print(name+"->"+words)
sayWord(words="想看雪")#小白->想看雪

收集参数(可变参数)

1
2
3
4
5
6
def test(*params):
print("参数长度是:",len(params))
print("第二个参数是:",params[1])
test(1,"雄安",3.21,4,5,6)
#参数长度是: 6
#第二个参数是: 雄安
1
2
3
4
5
6
7
def test(*params,exp='关键字参数'):
print("收集参数长度是:",len(params),exp)
print("第二个参数是:",params[1])
test(1,"雄安",3.21,4,5,6)
收集参数如果有其他参数在里面,
会报错:TypeError: test() missing 1 required keyword-only argument: 'exp'
要把关键字参数使用上

函数和过程

对于一般的编程语言来说函数是有返回值,过程是没有返回值的;

但是python只有函数没有过程

1
2
3
4
5
def hello():
print("Hello World")

temp=hello()#Hello World
print(temp)#None

返回值

python动态确定返回类型

1
2
3
4
5
def back():
# return {1,"shu",2.43} ---》{1,"shu",2.43}
return 1,"shu",2.43
#(1, 'shu', 2.43)
print(back())

变量的可见性

局部变量和(global)全局变量

在函数中对全局变量修改值时,系统会自创建一个新的同名的局部变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def discount(price,rate):
final_price=price*(1-rate)
old_price=50
print("修改的old_price:",old_price) # 50 创建了一个局部变量
return final_price

old_price=float(input("请输入价格:")) #100
rate=float(input("请输入折扣率:")) #0.1
new_price=discount(old_price,rate)
print('修改后old_price的值是:',old_price)# 100
print('打折后的价格是:',new_price) #90

global old_price
old_price=50#全在函数中局修饰后,只会被变为全局变量
修改的old_price: 50
修改后old_price的值是: 50

内嵌函数和闭包

内嵌函数

1
2
3
4
5
6
7
8
9
10
11
def fun1():
print("fun1()函数正在被调用")
def fun2():
print("fun2()函数正在被调用")
fun2()

fun1()
#fun1()函数正在被调用
#fun2()函数正在被调用
fun2()
#NameError: name 'fun2' is not defined

闭包()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def fun1(num1): #在内部函数的fun2的外部作用域时fun1的整个内部空间的变量x进行引用
print("num1:",num1)
def fun2(num2):
print("num2:",num2)
return num1+num2
return fun2

i=fun1(5)
print(type(i))
print(i(7))
'''
num1: 5
<class 'function'>
num2: 7
12
'''
print(fun1(1)(3))
'''
num1: 1
num2: 3
4'''
在fun2()中返回的之不能是fun2() ,会报错TypeError: fun2() missing 1 required positional argument: 'num2'

def fun1():
x=2
print("num1:",x)
def fun2():
# nonlocal x
x *= x
print("num2:",x)
return x
return fun2()
fun1()
会报错:UnboundLocalError: local variable 'x' referenced before assignment
解决方法:
def fun1(): #在内部函数的fun2的外部作用域时fun1的整个内部空间的变量x进行引用
x=[2] 变为列表
print("num1:",x)
def fun2():
x[0] *= x[0]
print("num2:",x[0])
return x[0]
return fun2()
fun1()
可以使用局部变量 推荐
def fun1(): #在内部函数的fun2的外部作用域时fun1的整个内部空间的变量x进行引用
x=2
print("num1:",x)
def fun2():
nonlocal x 推荐使用
x *= x
print("num2:",x)
return x
return fun2()
fun1()
#num1: 2
#num2: 4

lamda表达式

1
2
3
4
5
6
7
8
9
10
11
def ds(x):
return 2*x+3
print(ds(5))

g=lambda x : 2*x+3
print(g(5))

def add(x,y):
return x+y
m=lambda x,y : x+y
print(add(1,2)==m(1,2)) #True
lamda的作用:
  • 写脚本时,使用lamda表达式可以省下定义函数过程。
  • 对于一些比较抽象并且整个程序执行下来只需要带哦用两次的函数,有时候给函数起个名字也是头疼的问题,使用lamda就不需要考虑命名的问题
  • 简化带的可读性
比较厉害的BIF内置函数

filter(过滤的要求,要被过滤的内容)过滤器

1
2
3
4
5
6
7
8
9
list(filter(None,[1,0,False,True])) #[1, True] 过滤非True的内容

def odd(x): #获取偶数
return x%2
temp=range(10)
show=filter(odd,temp) #odd要过滤的内容,temp取值范围
list(show)

list(filter(lambda x:x%2,range(10))) #是上面的简化

map映射

递归

什么是递归?

有调用函数自身的行为,有个正确的返回条件

例子:汉诺塔游戏、树结构的定义、谢尔宾斯基三角形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
非递归方法
def factorial(n):
retult=n
for i in range(1,n):
retult *=i
return retult
number=int(input('请输入一个参数:'))
result=factorial(number)
print('阶乘是:',result)
递归阶乘方法
def recursion(x):
if x==1:
return 1
else:
return recursion(x-1)*x
递归例子——斐波那契数列:

分治思想是递归的主要思想

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
迭代方法:
def dei(m):
n1=n2=n3=1
if m<1:
print('请输入大于或等于1的值:')
return -1;
else:
while (m-2)>0:
n3=n1+n2
n1=n2
n2=n3
m-=1

return n3
递归方法:
def fei(m):
if m<1:
print('请输入大于或等于1的值:')
return -1
if m==1 or m==2:
return 1;
else:
return fei(m-1)+fei(m-2)

result=fei(20)
if result!=-1:
print("共有多少只兔子:",result)
递归例子——汉诺塔游戏
1
2
3
4
5
6
7
8
9
10
def hanol(n,x,y,z):
if n==1:
print(x,'-->',z)
else:
hanol(n-1,x,z,y)# 将前n-1个盘子从x移动到y上
print(x,'-->',z)# 将最底下的最后一个盘子从x移动到z上
hanol(n-1,y,x,z)# 将y上的n-1个盘子移动到z上

n=int(input('请输入汉诺塔的层数:'))
hanol(n,'x','y','z')

列表存储(对于大量数据的可以导入为一个数据包)

1
2
3
4
5
6
7
8
9
10
11
#永久存储 写
import pickle
my_list=[123,23.3,"我的",['another list']]
pickle_file=open("my_list.pkl","wb")
pickle.dump(my_list, pickle_file)
pickle_file.close()

# 打开 读数据
pickle_file=open("my_list.pkl","rb")
my_list2=pickle.load(pickle_file)
print(my_list2)

字典(sadomasochism):

当索引不好用时 ,选用字典

创建和访问字典
1
2


Exception异常处理

python设计游戏

猜数字游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import random
i=2
num=random.randint(1,10)
print('---------欢迎进入猜数字游戏-------------')
temp=input("不妨猜一下现在可能出现的是哪个数字:")
guess=int(temp)
while guess!=num and i!=0:#联合条件
i=i-1#有三次机会
# print("i=",i)
temp=input("猜错了请重新输入:")
guess=int(temp)
if guess==num:
print("猜对了!")
else:
if guess<num:
print("猜小了,正确答案是",num)
else:
print("猜大了,正确答案是",num)

print('游戏结束')

打飞机

实现逻辑:

###

CATALOG
  1. 1. Python简介
  2. 2. Python的安装(免安装版)
  3. 3. Idea下Python开发平台的搭建
  4. 4. 基础入门
    1. 4.1. 变量和字符串
      1. 4.1.1. 类型转换
    2. 4.2. 常用操作符
    3. 4.3. 分支和循环
      1. 4.3.1. 条件表达式(三元操作符)
      2. 4.3.2. 断言 assert
      3. 4.3.3. while循环
      4. 4.3.4. for循环(与c不太一样,更强大)
    4. 4.4. 序列
      1. 4.4.1. 列表、元组和字符串的共同点
      2. 4.4.2. 列表
        1. 4.4.2.1. 创建列表
        2. 4.4.2.2. 向列表列表添加元素
        3. 4.4.2.3. 从列表中获取元素
        4. 4.4.2.4. 从列表中删除元素
        5. 4.4.2.5. 列表分片slice
        6. 4.4.2.6. 列表的一些常用操作符
        7. 4.4.2.7. 列表类型内置函数
      3. 4.4.3. 元组
      4. 4.4.4. 字符串
        1. 4.4.4.1. 奇葩的内置方法
        2. 4.4.4.2. 格式化
    5. 4.5. 函数
      1. 4.5.1. 实参和形参
      2. 4.5.2. 关键字参数
      3. 4.5.3. 默认参数
      4. 4.5.4. 收集参数(可变参数)
      5. 4.5.5. 函数和过程
      6. 4.5.6. 返回值
      7. 4.5.7. 变量的可见性
      8. 4.5.8. 内嵌函数和闭包
      9. 4.5.9. lamda表达式
        1. 4.5.9.1. lamda的作用:
        2. 4.5.9.2. 比较厉害的BIF内置函数
      10. 4.5.10. 递归
        1. 4.5.10.1. 什么是递归?
        2. 4.5.10.2. 递归例子——斐波那契数列:
        3. 4.5.10.3. 递归例子——汉诺塔游戏
    6. 4.6. 列表存储(对于大量数据的可以导入为一个数据包)
      1. 4.6.1. 字典(sadomasochism):
        1. 4.6.1.1. 创建和访问字典
    7. 4.7. Exception异常处理
  5. 5. python设计游戏
    1. 5.1. 猜数字游戏
    2. 5.2. 打飞机