1.1注释#
注释可以单独占一行,也可以放在语句行的末尾。注明代码的内容。
1.2魔术命令%
为常见的任务提供便利,或帮助控制系统的行为。
1.3装饰器@## 标题
在不改变原有功能代码的基础上,添加额外的功能,如用户验证等。
a='hello world'#赋值语句a为引用
a='hi boy'
a=1
print(a)#得到的结果会是a=1
python有六个标准的数据类型:
Number(数字)、String(字符串)、List(列表)
Tuple(元组)、Set(集合)、Dictionary(字典)
其中不可变数据:Number(数字)、String(字符串)、Tuple(元组);可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
#number类型
a, b, c, d = 20, 5.5, True, 4+3j
print(type(a), type(b), type(c), type(d))
#
a = 11
isinstance(a, int)#True
#type()不会认为子类是一种父类类型。isinstance()会认为子类是一种父类类型。
#字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符。字符串的截取采用:变量[头下标:尾下标]。
str='hahaha'
print (str[0:-1]) # 输出第一个到倒数第二个的所有字符
print (str[0]) # 输出字符串第一个字符
print (str[2:5]) # 输出从第三个开始到第五个的字符
#tuple元组同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。元组中的元素类型也可以不相同。
tuple = ( 'abcd', 7 , 2.3, 'runoob', 70 )
print (tuple[0]) # 输出元组的第一个元素
print (tuple[1:3]) # 输出从第二个元素开始到第三个元素
print (tuple[2:]) # 输出从第三个元素开始的所有元素
#list写在[]内,元素值可以修改
list = [ 'abcd', 7 , 2.2, 'runoob', 1 ]
list[2] = 3
#集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。
#基本功能是进行成员关系测试和删除重复元素。
#可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
a = set('abmnadqbra')
b = set('alaczplksdbrtam')
print(a)
print(a - b) # a 和 b 的差集
print(a | b) # a 和 b 的并集
print(a & b) # a 和 b 的交集
print(a ^ b) # a 和 b 中不同时存在的元素
#字典键值对类型key-value
tinydict = {'name': 'runoob',
'co':12,
'site': 'www.runoob.com'}
惰性计算(Lazy evaluation),是指仅仅在真正需要执行的时候才计算表达式的值。作用:避免不必要的计算,带来性能的提升;节省空间,使得无线循环的数据结构成为可能。
#惰性计算
range(0,10)#ranhe(0,10)
list(range(10))#[1,2,3,4,5,6,7,8,9]
list(range(0,10,4))#[0,4,8]
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器对象可以使用常规for语句或者next方法+条件语句进行遍历。
#可迭代对象
list1=[1,2,3,4,5]
for i in list1:
print(i,ean=",")
#1,2,3,4,5,
mylist=iter(list1)#将可迭代对象转变成迭代器
print(next(mylist))#1
print(next(mylist))#2
print(next(mylist))#3
生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要再手动实现两方法。
生成器在迭代的过程中可以改变当前迭代值,而修改普通迭代器的当前迭代值往往会发生异常,影响程序的执行。
def myList(num): # 定义生成器
now = 0 # 当前迭代值,初始为0
while now < num:
val = (yield now)
# 返回当前迭代值,并接受可能的send发送值;yield在下面会解释
now = now + 1 if val is None else val
# val为None,迭代值自增1,否则重新设定当前迭代值为val
my_list = myList(5) # 得到一个生成器对象
print(my_list.next()) # 返回当前迭代值
print(my_list.next())
my_list.send(3) # 重新设定当前的迭代值
print(my_list.next())
#从左向右索引是正的,从右向左索引是负的。
mylist=list("rucmatthewchen")
mylist[0]#r
mylisy[-2]#e
x,y,z=1,2,3
x,z#输出1和3
x=1
y=2
x,y=y,x+y
x,y#输出的结果是2和3
x,_,z=1,2,3#相当于元组
x,z#输出(1,3)
_#输出2
m,*_,n=1,2,3,4,5
m,n#输出结果(1,5)
列表推导式\lambda表达式和三元组运算符?:
[type(item) for item in[1,"hi",True,10.2]]
#[int,str,bool,float]
z=lambda x,y:x*y
z(2,3)
#6
x=0
result='yes' if x>0 else 'no'
result
#no
def mydemo(i,j=2):
'''此处是docString
'''
j=i+1
return j
print(mydemo(3))
def fuc(s1,s2):
print('s1=',s1)
print('s1=',s1)
fuc("a","b","c","d")
#s1=a s2=("b","c","d")
import os
os.getcwd()#查看当前工作目录
os.chdir("E:\\TEST")#修改当前工作目录注意要已经在系统里建立起工作目录
name='chen'
age=18
#老式的两种方法
"%s is %d years old" % (name,age)
"{} is {} years old".format(name,age)
#F-Srting方法
f'{name} is {age} years old'
#"chen is 18 years old"
class Person:
'''此处为类Person的docString
'''
nationality='China'
_deposit =10
__gender='man'
# _xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入。
# __xx 双下划线的表示的是私有类型的变量。只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变。
# __xx__定义的是特列方法。用户控制的命名空间内的变量或是属性,如init , __import__或是file 。只有当文档有说明时使用,不要自己定义这类变量。 (就是说这些是python内部定义的变量名)
def __init__(self,name,age):
age=age#局部变量
self.name=name#实例属性,self就指向创建的实例本身,
#内置方法__init__方法的第一参数永远是self。
#有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数。
#但带有self不需要传,Python解释器会自己把实例变量传进去。
#完成类的定义,就可以通过类创建出实例,利用【实例名.函数名】形式访问实例方法
def sayhi(self):
print(self.name)
@classmethod
def class_func(cls)
cls.nationality='China'
print('I am form {0}'.fomat(cls.nationality))
#类方法的定义需要在方法前加 @classmethod。
#类方法的第一个参数必须为cls,着呀个可以通过类名调用类方法。
@staticmethod
def static_func(x,y):
print(x*y)
#静态方法定义前需要加@staticmethod,通常没有任何参数的函数定义为静态方法。
p=Person('matthew',20)
p.seyhi()#matthew