python学习记录

目录

1.python基础

2.函数

3.高级特性

4.函数式编程

5 面向对象编程


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有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

所以,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()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的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__方法,在创建实例的时候,就把namescore等属性绑上去:

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_nameget_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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值