目录
1.python基础
- 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组——类似列表可以包括不同类型用小括号);
- 可变数据(3 个):List(列表——类似数组用方括号)、Dictionary(字典——类似于map,键值对)、Set(集合——类似字典但是没有value用花括号)。
一 Python内置的一种数据类型是列表:list。
list是一种有序的集合,可以随时添加和删除其中的元素。
classmate=['hx','hy','hxc']
len(classmate) //求列表长度
classmate[0]//代表第一个元素的值
classmate.pop()//删除末尾元素
classmate.pop(i)//指定删除第i个元素
del classmate[i] 删除指定元素
classmate.append()//追加元素到末尾
二 另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改
t = (1, 2)
input 默认返回str类型 如果要返回int型需要进行强制转换 int(input())
三 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['School'] = "菜鸟教程" # 添加信息
del d['Name'] # 删除键值对'Name'
d.clear() # 清空字典 字典还在
del d # 删除字典 字典不在报错
print(d)
四 set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
s=set([1,2,3])
s.add(5)
s.remove(1)
五 if:else:注意加冒号(if else的使用)
age = int(input('input your age'))
if age >= 15:
print('you are teenagers')
else:
print('you are baby')
六 1 循环遍历列表 (for循环的使用 有冒号:)
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
sum=0
for num in range(100)://range(n)生成0-n的列表
sum+=num//求0-100之和
print(sum)
d={'x': 'A', 'y': 'B', 'z': 'C' }
for k, v in d.items():#遍历两个变量
print(k, '=', v)
2 while循环
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
break 提前退出循环
n = 1
while n <= 100:
if n > 10: # 当n = 11时,条件满足,执行break语句
break # break语句会结束当前循环
print(n)
n = n + 1
print('END')
continue 退出本轮循环执行下一次循环
n = 0
while n < 10:
n = n + 1
if n % 2 == 0: # 如果n是偶数,执行continue语句
continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
print(n)
2.函数
七 a.自定义函数
在Python中,定义一个函数要使用def
语句,依次写出函数名、括号、括号中的参数和冒号:
,然后,在缩进块中编写函数体,函数的返回值用return
语句返回。
def mymax(x,y):
if(x>y):
return x
else:
return y
print(mymax(3,6))
b.可变参数
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。我们以数学题为例子,给定一组数字a,b,c……,请计算a + b + c + ……
def add(list):
sum=0
for x in list:
sum+=x
return sum
list=[1,2,3,4,5,6]
print(add(list))
c.python允许在list或tuple前面加一个*号把list和tuple元素变成可变参数传进去
def add(*list):
sum=0
for x in list:
sum+=x
return sum
print(add(1,2,3,4,5,6))
d.关键字参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def student(name,age,**other):
print('name:', name, 'age:', age, 'other:', other)
student('hx','18',place='cw')
e.参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
总结
*args
是可变参数,args接收的是一个tuple;
**kw
是关键字参数,kw接收的是一个dict。
3.高级特性
八 高级特性之切片——对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作。
list=[1,2,3,4,6,7]
print(list[:3])#从0开始到第3个 可以省略0
print(list[1:3])
print(list[-2:]) #倒切
print(list[-1::-1])#实现逆序
print(list[::2]) #每隔两个分割
print(list[:4:2]) #前4个数每隔两个分割
九 迭代——当我们使用for
循环时,只要作用于一个可迭代对象,for
循环就可以正常运行,而我们不太关心该对象究竟是list
还是其他数据类型。
d = {'a': 1, 'b': 2, 'c': 3}
for key in d.values():#遍历值
print(key)
for key in d:#遍历键
print(key)
十 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
print([x * x for x in range(1, 11) if x % 2 == 0])
print([x * x for x in range(1, 11) ])
十一 生成器——如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
第一种方法很简单,只要把一个列表生成式的[]
改成()
,就创建了一个generator
4.函数式编程
十二 高阶函数
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
1 filter()
也接收一个函数和一个序列。和map()
不同的是,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
2 map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
3 Python内置的sorted()
函数就可以对list进行排序,此外,sorted()
函数也是一个高阶函数,它还可以接收一个key
函数来实现自定义的排序,例如按绝对值大小排序abs
sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
4 返回函数:高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
5 匿名函数:当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。以map()
函数为例,计算f(x)=x2时,除了定义一个f(x)
的函数外,还可以直接传入匿名函数
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
6偏函数 functools.partial
就是帮助我们创建一个偏函数的,不需要我们自己定义int2()
,可以直接使用下面的代码创建一个新的函数int2
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
5 面向对象编程
1.由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__
方法,在创建实例的时候,就把name
,score
等属性绑上去:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
2 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__
,在Python中,实例的变量名如果以__
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
3 但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name
和get_score
这样的方法,如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score
方法:
def get_score(self):
return self.__score
def set_score(self, score):
self.__score = score
4 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
class Animal(object):
def run(self):
print('Animal is running...') #父类
class Dog(Animal): #子类
pass
dog = Dog()
dog.run() #子类调用父类方法
新增一个Animal
的子类,不必对run_twice()
做任何修改,实际上,任何依赖Animal
作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。
5 静态语言 vs 动态语言
对于静态语言(例如Java)来说,如果需要传入Animal
类型,则传入的对象必须是Animal
类型或者它的子类,否则,将无法调用run()
方法。
对于Python这样的动态语言来说,则不一定需要传入Animal
类型。我们只需要保证传入的对象有一个run()
方法就可以了
6 获取对象信息
基本类型都可以用type()
判断:
使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”
获得一个对象的所有属性和方法,可以使用dir()
函数
7 实例属性属于各个实例所有,互不干扰;
类属性属于类所有,所有实例共享一个属性;
8 由于Python允许使用多重继承,因此,MixIn就是一种常见的设计。
6.图形界面
1.利用Tkinter制作弹窗
from tkinter import *
import tkinter.messagebox as messagebox
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.nameInput = Entry(self)
self.nameInput.pack()
self.alertButton = Button(self, text='Hello', command=self.hello)
self.alertButton.pack()
def hello(self):
name = self.nameInput.get() or 'world'
messagebox.showinfo('Message', 'Hello, %s' % name)
app = Application()
# 设置窗口标题:
app.master.title('Hello World')
# 主消息循环:
app.mainloop()
2.利用turtle绘画几何体
# 导入turtle包的所有内容:
from turtle import *
# 设置笔刷宽度:
width(4)
# 前进:
forward(200)
# 右转90度:
right(90)
# 笔刷颜色:
pencolor('red')
forward(100)
right(90)
pencolor('green')
forward(200)
right(90)
pencolor('blue')
forward(100)
right(90)
# 调用done()使得窗口等待被关闭,否则将立刻关闭窗口:
done()