Lmxy1990 ' Blog

python 笔记

变量类型

python 是弱类型语言.但其也有标准的类型.

Numbers(12)
String(’abc’)
List([1,2])
Tuple((1,2))
Dictionary({‘Michael’: 95, ‘Bob’: 75, ‘Tracy’: 85})
Set (([1, 2, 3]))

变量不需要定义,直接使用变量名进行赋值. 赋值指定格式就是相应的类型.
Numbers 相当于java的int,short,long 合集.
String 跟java的一样.
List 一样
Set 一样.
Tuple 相当于数组
Dict 相当于Map C# 也是dict.

ps: python 是根据缩进来判断作用域的.

函数定义/调用

定义函数

1
2
def functionA(X):
return x*x ;

调用函数
print(functionA(3)) ;

特性

1.切片,取出list或者tuple中部分元素.
L = [‘aaa’,’bbb’,’ccc’]

正序取:第一个是取出位置(包括该位置的元素),第二个是截止位置(不包括该位置的元素)
取出第一个元素L[0:1]
取出前2个元素:L[0:2]
倒序取:第一个是倒序截止位置(包括),第二个倒序是开始取值位置(不包括).
取出最后一个元素:L[-1]
取出倒数第二个元素:L[-1:-2]

2.迭代.遍历对象
for var in object

可以通过isinstance(checkObject, Iterable)来判断该对象是否可以进行迭代.
不推荐使用(objct) is type(object1) 来进行类型检查是因为type不可靠.

1
2
3
4
5
6
class A():
pass;
class B():
pass;
type(A) is type(B) ;
>>>True

遍历dict对象的key
for key in dict

遍历dict对象的value
for var in dict.valuse()

遍历key与value
for k,v in dict.items()

遍历list的下标与值
for i,v in enumerate(list)

3.构造器
生成1,2,3…9的list
range(1,10)
生成 1,4,9…81的 list
[x*x for x in range(1,10)]

4.赋值
可以同时多个赋值.
a,b,c = 1,2,3 ;

高阶函数

1.map /reduce python的map不同于java..

map 是对每个子元素进行函数运算.

1
2
3
4
def f(x) :
return x*x ;

map(f,range(1,10));

输出:[1,4,9,25,36,49,64,81]

reduce 是对没两个元素进行操作.

1
2
3
def fx(x,y):
return x*y +x+y ;
reduce(fx,range(1,10)) ;

2.filter 过滤函数
filter 是对每个元素进行检查,返回true的保留.返回false的删除.

1
2
3
4
5
6
def ff(x):
if (x > 5):
return true ;
else:
return false ;
filter(ff,range(1,10)) ;

3.sorted 排序
升序
sorted([36, 5, -12, 9, -21])
绝对值升序排序
sorted([36, 5, -12, 9, -21],key=abs)
忽略大小写升序排序
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower
倒序
sorted([36, 5, -12, 9, -21],reverse=true)

4.lambda表达式
传入x,y 返回 xy
`lambda x,y:x
y`

5.装饰器
装饰器是面向切面编程的概念,主要目的是对程序进行相同代码块的冗余去除.

定义装饰器:
参数:args 称作为数组参数,*kwargs 称作为字典参数.表示可以传进来任意类型任意值.

1
2
3
4
def log(func):
def proxy_f(*args,**avg):
return func(*args,**avg) ;
return proxy_f ;

使用装饰器.
在对应的函数前加上@log就可以.

1
2
3
4
5
6
@log
def now():
print('2015-3-25') ;

//调用
now() ;

也可以这样使用装饰器
now = log(now)

6.偏函数
目的:把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单.

1
2
3
4
5
6
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

模块

1.概述
python 的模块有点类似于java的包–类这样的结构.一个python文件相当于一个模块.不同模块的函数名可以相同.单不要与内置的函数名重名.模块名之外,是包名,类似于java.不过包名目录必须有init.py这个文件.

2.使用模块
导入模块 (模块名不含.py,跟java引入类一样,不含.class)
import model_name

2.使用模块(模块名.函数名来调用相应模块的函数.)
model_name.func_name

3.使用pip工具安装模块
pip install 模块名

4.模块搜索路径

1
2
3
import sys

sys.path

5.添加自定义的搜索路径
添加环境变量:PYTHONPATH

面向对象

  1. 类/对象(实例)
    与一般面向对象语言定义基本一致.

2.区别(下划线都是两个)
可以不定义成员属性,直接使用self.XX来赋值.也可以定义一个默认的成员属性.也可以在实例化后定义…
初始化构造器(连续两个下划线):
def __init__ (paramter1,...)

XX 定义的方法(函数)是特殊函数方法.例如:init
以__XX定义的成员变量/方法(函数) 是私有的(private).不能被外部访问.
以_XX定义的变量/方法 外部不应该去访问它.但实际是可以访问到的.

不能通过实例.__XX 来对私有变量进行赋值.这样赋值是赋值给一个新的变量,而非该实例的内部成员变量.
这样是错误代码:

1
2
3
4
5
6
>>> bart = Student('Bart Simpson', 98)
>>> bart.get_name()
'Bart Simpson'
>>> bart.__name = 'New Name' # 设置__name变量!
>>> bart.__name
'New Name'

3.继承与多态
继承父类,覆写父类方法.符合李氏替换原则.遵循多态.

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。

对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:

4.成员属性限制:
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

IO 编程


End

坚持原创技术分享,您的支持将鼓励我继续创作!