一 基本概念
1. 常量
动态语言,可在运行中随时改变变量类型
可强制类型转换
>>>a=1.8
>>>b=int(a)
>>>print b #并不是四舍五入
1
2. 数
整数
长整数
浮点数
复数
0.0+0.0j
互动作业:复数的使用和表示法
虚数不能单独存在,它们总是和一个值为 0.0 的实数部分一起来构成一个复数。
复数由实数部分和虚数部分构成
表示虚数的语法: real+imagj
实数部分和虚数部分都是浮点数
虚数部分必须有后缀j 或J。
eg:64.375+1j 4.23-8.5j 0.23-8.55j 1.23e-045+6.7e+089j
复数的内建属性:
属性 描述
num.real 该复数的实部
num num.imag 该复数的虚部
num.conjugate() 返回该复数的共轭复数
3. 字符串
单引号 ‘abc’
双引号 “abc”
单引号和双引号混合使用
>>>a='"abc"'
>>>print a
"abc"
三引号 '''abc''' """abc"""
如果没有对三引号进行复制操作如a="""abc""" 那么它表示块注视(JAVA中的//),三引号的另一种使用方式叫做文档字符串(相当于JAVA中的方法注释/*abc*/,JAVA中方法注释可以生成API,python中help展现出的文字就是用文档字符串注释的)
转义符 \
和其他语言相同
>>>a="abc\ndef"
>>>print a
abc
def
原生字符串 r”hello world!\n”
正则表达式中使用较多
>>> a=r"hello shit!\n"
>>> print a
hello shit!\n
处理中文前面带u(表示unicode 一个汉字占两字节)
关于python中文处理详细知识可参考下面两个帖子
字符串是特殊的列表,关于索引 切片 增删等在列表中做详细讲解
>>> a="123456"
>>> b="_".join(a)
>>> print b
1_2_3_4_5_6
常用的索引相关操作
切割操作
邪恶的eval() eval/I`vael/ 重新运算求出参数的内容
>>> a='1+1'
>>> eval(a)
2
>>> type(eval(a))
<type 'int'>
>>>
>>> b='"1"+"1"'
>>> eval(b)
'11'
>>> b='"1"+"2"'
>>> eval(b)
'12'
>>> type(eval(b))
<type 'str'>
对于eval的理解:将最终结果扒了层皮,如a='1+1' 先计算内部值a='2' 然后扒皮a就成整数2了。再如a='1'*5,先计算a='11111',后扒皮a=整数11111,eval(eval('"1"')) 扒了两次皮最终结果依然是整数1。理解含义就是修炼独孤九剑。
4. 变量
首字符为字母(大小写均可)或为下划线(_)
其他部分字符为字母(大小写均可)、数字、下划线
区分大小写,myname与myName是两个不同的变量
Python 与大多数其它语言一样有局部变量和全局变量之分,但是它没有明显的变量声明。变量通过首次赋值产生,当超出作用范围时自动消亡。
5. 数据类型
根据数据结构划分:线性表,链表,哈希表。对应的:线性容器(数组,ArrayList),链式容器(LinkedList[这货比较牛逼可以当作栈,队列,双向队列来使用]),hash容器(hashmap,hashset,hashtable)
数值
字符串
线性容器
线性容器的特点:可以通过index访问其元素的容器,因此String也是特殊的线性容器,只不过这个容器中的每个元素是一个字符类型(char)。
– 字符串
– List(列表)
eg: tag = [1,2,3,4,5,6,7,8,9]
– tuple(元组)
eg: tag = ('robots', 77, 93, 'try')
列表和元组的区别是列表可修改,元组不能修改,列表就像JAVA中的ArrayList,元组就像JAVA中的数组(一旦定义大小不可改变),需要注意的是这里的元组不变性指的是元组本身,元组中的元素是可以改变的。
关于列表和元组的更多内容参考
http://codingnow.cn/python/325.html
Hash容器
hash容器的数据结构是哈希表。hash就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。简单的说就是用来确定元素唯一性的(所以JAVA中我们在比较对象时要重写hashcode方法),比如下面的Dict字典(字典的Key必须是唯一的,像JAVA中的Hashmap),set集合(set集合中的元素必须是唯一的,像JAVA中的Hashset,TreeSet)。要注意的是:hashcode不同值一定不同,hashcode相同值不一定相同.
eg: tag = {'host': 'earth'}
– Dict(字典)
– set(set集合)
None
类似于JAVA中的NULL,当变量为None类型时只是声明了变量并没有分配内存空间。对于Python在内存的分配后面得好好看看,这里猜测下应该是在栈里面声明了变量名,并没有在堆中分配内存大小。
逻辑类型(True, False)
python中非0都是true
6. 逻辑行与物理行
什么叫逻辑概念和物理概念
逻辑概念比物理概念更抽象些,就如Python的逻辑行表示的是PVM的编译行,物理行是我们代码的真实行。那么由此可以理解高级语言就是物理概念,机器语言就是逻辑概念,我们的每个操作,每个变量都将变成机器识别的0 1串。这个0 1串是有规律的(或者说是有逻辑的),只有有规律的东西机器才能识别(由此可想机器永远不会变的和人一样有思维,因为人的思维是无规律的,机器做不出无规律的程序,好吧YY了)。再看数据结构,元组是真实存在的,我们可以操作它,因此它是一个物理概念。序列是一个定义,它是抽象的。我们不能说创建一个序列。那么序列就是一个逻辑概念。但是我们都知道元组就是一个序列。由此可见:物理概念是逻辑概念的具体表现形式,是客观存在的。逻辑概念是物理概念的抽象定义,是主观存在的。
7. 缩进
同意层次的语句必须有相同的缩进
不要混合使用空白和制表符,这样在不同平台中将无法工作。
强烈建议在缩进时,使用单个制表符或两个或
四个空格(wing ide中tab默认8个空格,修改:Editor-Indentation)
2) 运算符与表达式
1. 运算符
2. 运算符的优先级
-(常量,变量,函数,对象)+运算符+优先级
python是一个更精粹的面向对象语言,除了运算符全是对象。
3. 表达式
互动作业:表达式在计算机中是如何展开的
4. repr()
互动作业:repr()的使用
首先repr是reprensent的缩写,它的意思是表现.
repr()和str()方法很像(repr()的使用等价于反引号``),这两个函数接受一个对象作为其参数,返回适当的字符串。可以方便地以字符串的方式获取对象的内容、类型、数值属性等信息。str()函数得到的字符串可读性好,而repr()函数得到的字符串通常可以用来重新获得该对象,通常情况下
obj==eval(repr(obj))
这个等式是成立的(回想之前的eval使用:将返回结果扒层皮,repr()返回的是解释器识别的字符串,字符串继承于obj,所以字符串再扒皮不就获得了它的原始对象了。(注意:并不是所有repr()返回的字符串都能够用 eval()内建函数得到原来的对象。)那么我可以理解repr()方法就是给对象穿一层string皮,这和eval恰恰相反)。
3) 逻辑控制结构
if
>>>a=1
>>>if a==1:
print 1
elif a==2:
print 2
else:
print 3
1
for
>>> for x in range(10):
print x,
0 1 2 3 4 5 6 7 8 9
>>>
>>> a=('f',1,2,3,'3')
>>> for x in a:
print x,
f 1 2 3 3
>>>
关于for循环的尾巴else:即在for 循环中,如果没有从任何一个break中退出,则会执行和for对应的else只要从break中退出了,则else部分不执行。
//注:加逗号不换行
>>> for i in range(0,10):
while
>>>a=1
>>>while a<100:
print a
a+=1
else :
print 'over'
>>>
while循环的尾巴else用法和for循环的else相同
break
continue
注意:python中没有i++ i--
4) 函数
Python中函数表现形式
>>>def fun(a="a",b=2,c=3):
"""my first function"""
print "a=%s"%a #%s代表字符串
print "b=%d"%b #%d代表整数
print "c=",c #显示出来是:c= 3 多个空格
return c,b+c #
可以返回多个返回值,如果用一个变量接收多个返回值,返回的将是一个元组
lambda表达式
>>> f1=lambda x,y:x+y
>>> print f1(1,2)
3
>>>
闭包
>>>def fun1(x):
def fun2(y):
return x+y
return fun2
>>>q=fun1(8)
>>>print q(100)
108
python中函数必须有名字,要想使用匿名函数则需要使用lambda函数
>>>def fun1(x):
return lambda y:x+y
>>>q=fun1(8)
>>>print q(100)
108
对于闭包可以理解为对象内部包含对象,内部的对象是外部对象的一个属性。JAVA中闭包是通过接口+内部类实现的,
闭包允许你将一些行为封装,将它像一个对象一样传来递去,而且它依然能够访问到原来第一次声明时的上下文。
5) 面向对象编程
变量:
1. 前带_的变量: 标明是一个私有变量, 只用于标明, 外部类还是可以访问到这个变量
2. 前带两个_ ,后带两个_ 的变量: 标明是内置变量,
3. 大写加下划线的变量: 标明是 不会发生改变的全局变量
函数:
1. 前带_的变量: 标明是一个私有函数, 只用于标明,
2. 前带两个_ ,后带两个_ 的函数: 标明是特殊函数
class a:
def __init__(self): #__init__是a类的构造函数,这里是无参构造函数。
self.m=1
def add(self): #self的使用有点像JAVA中this的感觉
self.p=2
print self.m+self.p
def __nn_(self): #这是专有函数 子类不能调用
print 'ee'
class b(a): #b(a) 表示b继承于a
def __init__(self):
a.__init__(self) #这里必须显性的调用a类的构造方法(因为我们重写了a类的构造器)
self.n=2
def sum(self):
print self.m+self.n
def __dd(self): #这是私有函数 不能直接通过类的实例对象去调用
print 'dd'
class UserProfile(object):
def __init__(self, profile): #这是有参构造方法
self._profile = profile #_profile表示私有变量,只是表示外部类还是可以访问到这个变量
def profile(self):
return self._profile+1
>>>
user=UserProfile(10)
>>>print user.profile()
6) 异常处理
>>>def fuc():
try:
fucc()
except Exception,e: #except相当于JAVA中的catch, Exception是一个类,它的实例我们起名叫e
print e.message
>>>fuc()
global name 'fucc' is not defined
防御式编程
对于防御式编程来说异常处理只是其中一种方案,它更应该是一种编程思想,一种编程习惯。我们来看下《代码大全》中这些话。
想到四个字---学无止尽。对于工作中的防御式编程,最深的体会应该是,NullpointExcetion了,我在调用对象方式时已经下意识的去考虑对象是否可能为空。
7) 模块与包
在组织模块与包的时候文件夹下面必须有一个__init__.py文件,来告诉编译器这个文件夹是一个模块
我们可以打开自己的python安装目录下Lib目录查看其中文件夹,发现每个文件夹中都包含这文件。
__init__.py文件另一个作用是:可以在该文件中写入事件,一旦这个包被import就会触发这个事件(好强大,似乎可以写木马)
当我们在eclipse中编程时,如果给一个文件夹中新建一个__init__.py文件 那么这个文件夹的图标就会变成一个package图标
指定编码格式:#coding=utf-8(或者 # -*- coding: UTF-8-*- ) //注意将文件另存为utf-8的格式
指定编辑器版本:#!/usr/bin/python2.7
8) 输入、输出、文件和目录操作
os.walk()返回一个三元素的tuple:当前路径、子文件夹名称、文件列表。
Os.listdir()返回指定路径下的所以文件和文件夹
本文深入探讨Python编程的基础概念,包括常量、数、字符串、变量、数据类型、逻辑行与物理行、缩进、运算符与表达式、逻辑控制结构、函数、面向对象编程等核心知识点。
1584

被折叠的 条评论
为什么被折叠?



