2019-09-10-python
python
注释:
单行#comment 多行'''comment''' """comment"""
1 | python2 -m pip install --upgrade pip |
基础语法
![[python01]](/posts/a4d4b8b8/python01.png)
![[python02]](/posts/a4d4b8b8/python02.png)
1 | from package import module |
变量和数据类型
对象(object)是内存中专门用来存储数据的一块区域,
id
&&type
&&value
变量和对象:
(1)对象并没有直接存储到变量中,Python中
变量更像是给对象起了一个别名
;(2)
变量中存储的不是对象的值,而是对象的id(内存地址)
,使用变量时,实际上就是在通过对象id在查找对象
;(3)变量中保存的对象,只有在为变量重新赋值时才会改变;
(4)变量和变量之间是相互独立的,修改一个变量不会影响另一个变量
python中的数据类型: 不可变(
Number/String/Tuple
) 和 可变(list/dict/set
),不可变值得是不允许变量的值发生变化,如果改变变量的值,相当于新建了一个对象,而对于相同值的对象,在内存中只有一个对象。
如果改变数字数据类型的值,意味着是一个新的对象,将会重新分配内存空间
判断是否引用的是同一个对象: x is y,类似于id(x)===id(y)
数据类型
整数、浮点数(1.23x10^9: 1.23e9)
字符串
1
2
3
4'abc', "xyz" >> abc xyz
'I\'m\"OK\"!' >> I'm OK!
r'\\\t\\' >> '\\\t\\' # 原始字符串r
r'''hello,\nworld''' >> 'hello,\\nworld'布尔值
1
2
3and: ture and flase >> false
or: false or true >> true
not: not false >> true
变量
变量名必须是
大小写英文、数字和_
的组合,且不能用数字开头, Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”
,而变量
就是在程序中用来指向这些数据对象
的,对变量赋值就是把数据和变量给关联起来.
1 | # -*- coding: utf-8 -*- |
字符串和编码
Python 3版本中,字符串是以Unicode
编码
1 | ord('中') >> 20013 |
格式化输出(%
)
%s %d %?
1
2
3'Hello, %s' % 'world' >> 'Hello, world'
print('%2d-%02d' % (3, 1)) >> 补空格3-01
print('%.2f' % 3.1415926) >> 3.14format()
1
'Hello, {0}, 成绩提升了{1:.1f}%'.format('小明', 17.125) >> 'Hello, 小明, 成绩提升了17.1%'
格式化字符串
- 格式化字符串,可以通过在字符串前添加一个f来创建一个格式化字符串
- 在格式化字符串中可以直接嵌入变量
1
c = f'hello {a} {b}' \ print(f'a = {a}')
list tuple dict set
list[]
Python内置的数据类型列表:list
是一种有序的集合,可以随时添加
和删除
其中的元素
方法 | 说明 |
---|---|
list.append() | 追加元素到末尾 |
list.insert() | 插入到指定位置 |
list.pop()方法 | 删除指定位置元素 |
list.len() | 列表元素个数 |
1 | classmates = ['Michael', 'Bob', 'Tracy'] >> ['Michael', 'Bob', 'Tracy'] |
tuple()
Python内置的数据类型有序列表
叫元组:tuple
,tuple和list非常类似,但是tuple一旦初始化就不能修改
1 | classmates = ('Michael', 'Bob', 'Tracy') |
dict{}
字典的
键
可以是任意的不可变对象
(int, str, bool, tuple…), 不能重复;字典的值可以是任何对象
{key1:value1,key2:value2,…}
1 | d = dict(name='Li',age='1',gender='boy') |
set{}
集合中只能存储不可变对象,
不重复且无序
; 将字典转为集合只包含字典中键
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的
1 | s = {'a', 'b', '1,' '2', '3'} >> {'a', 'b', 1, 2, 3} |
条件判断&&循环(注意缩进)
1 | # 判断水仙花数(n>=3) |
迭代器:iter和生成器:yield
迭代器是访问集合元素的一种方式,是可以记住遍历的位置的对象,从集合第一个元素开始到所有元素被访问完结束,只能往前不会后退;基本方法
iter()和next()
,字符串、列表和元组均可用于创建迭代器
生成器
是一个返回迭代器的函数
,只能用于迭代操作,更简单点理解生成器就是一个迭代器,调用一个生成器函数
,返回的是一个迭代器对象
,在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息
,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
1 | import sys |
函数
概念
- 函数是一个对象,在内存中专门用来存储数据的一块区域;如果形参执行的是一个对象,当通过形参去改对象时,会影响到所有指向该对象的变量;print(fn),fn是函数对象,实际是打印函数对象;而print(fn()),则是在打印fn()函数的返回值
- 定义:
1
2def functionName(argu1, argu2, ...):
code block
函数的参数:
位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n
1
2
3
4
5
6def power(x,n):
s = 1
while n > 0:
n = n -1
s = s * x
return s默认参数,必须指向不变对象
1
2
3
4
5def add_end(L=None):
if L is None:
L = []
L.append('END')
return L可变参数,允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个
tuple
1
2
3
4
5
6
7
8def calc(*numbers): # *nums表示把nums这个list的所有元素作为可变参数传进去
sum = 0
for n in numbers:
sum = sum + n * n
return sum
1, 2, 3] nums = [
calc(*nums)
14关键字参数,允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个
dict
1
2
3
4
5def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
'Bob', 35, city='Beijing') person(
name: Bob age: 35 other: {'city': 'Beijing'}
递归:
1 | def factorial(n): |
filter、匿名函数: lambda 与 map
filter(function,iterable)
: 可以从序列中过滤出符合条件的元素,保存到一个新的序列对象中,1
2a = filter(lambda x: x % 2 == 0, range(10))
0x0000027939040390> <filter object atlambda 参数列表 : 返回值
:1
filter(lambda i:i>5,l)
map(function, iterable, ...)
: 可以对可迭代对象中的所有元素做指定操作,然后将其添加到一个新的对象中返回,1
2map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
0x0000027939040CF8> <map object at
闭包:函数嵌套
&& 将内部函数作为返回值返回
&& 内部函数必须使用到外部函数的变量
1 | def makeAverager(): |
装饰器: 在不改变函数代码的情况下,扩展函数功能
1 | def log(old): |
面向对象编程
基础
类:对
对象
的抽象,是创建对象的模板;属性&&方法对象:则是由类创建的一个
实例
,而变量是指向对象的内容,如:a='abc'
,经常说的对象a的内容是’abc’,其实是指,a本身是一个变量,它指向的对象的内容才是’abc’定义类:
p1 = Person('an')
执行流程- (1)创建一个变量;
- (2)在内存中创建新对象;
- (3)
__init__(self)
方法执行,init在对象创建以后执行,用来初始化新创建的对象 - (4)将对象的id赋值给变量
- (5)self指的是类实例对象本身(注意:不是类本身)
- self参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14class Person:
def __init__(self, name): # 在对象初始化时执行
self.name = name # self为调用该属性/方法实例对象自身
# self.__name = name # 隐藏属性 __name ==> _Person__name
def sayHello(self):
print('我是:%s' %self.name)
def get_name(self):
# print('读取属性')
return self.name
def set_name(self, name):
# print('设置属性')
return self.name = name
p1 = Person('an')
特征:
封装:隐藏对象中一些不希望被外部所访问到的属性或方法,确保对象中的数据安全
- getter 获取对象中的指定属性(get_属性名)
- setter 用来设置对象的指定属性(set_属性名)
1
2
3
4
5
6
7
8
9
10
11class Person:
def __init__(self,name):
self._name = name
def get_name(self):
return self._name
def set_name(self , name):
self._name = name
p = Person('孙悟空')
print(p._name)
继承:实现子类的属性和方法的功能扩展,保证了对象的可扩展性
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
33class Animal:
def run(self):
print('动物会跑~~~')
def sleep(self):
print('动物睡觉~~~')
def name(self):
return self._name
def name(self,name):
self._name = name
class Dog(Animal):
def __init__(self,name,age):
# 调用父类的__init__来初始化父类中定义的属性
# super() 可以用来获取当前类的父类,
# 并且通过super()返回对象调用父类方法时,不需要传递self
super().__init__(name)
self._age = age
def bark(self):
print('汪汪汪~~~')
def run(self):
print('狗跑~~~~')
def age(self):
return self._age
def age(self,age):
self._age = name
d = Dog('旺财',18)
print(d.name)
print(d.age)多态:一个对象可以以不同的形态去呈现,保证了程序的灵活性
模块(python文件) 包(文件)
- 导入模块:
1
2import 模块名
import 模块名 as 模块别名 - 访问模块变量:模块名.变量名
- 导入模块部分内容:
1
from 模块名 import 变量 as 别名
异常
1 | print('异常出现前') |
文件
文件打开 –>操作文件(读/写) –>关闭文件
1 | file_name = 'demo.txt' |