Python学习笔记2

Python基础知识学习笔记

学习资源——Python123


5 字典

无序,可以理解为现实字典,“查字典”。

dictionary_name = {key_1: value_1,
               key_2: value_2
               }

字典的定义

如上,花括号定义。

>>> words={'python':'QAQ',
            'c++':'QwQ',
            'Java':'no response'}
   
>>> print("名称:%s" % 'python')
   
名称:python
>>> print("\n解释:%s" % words['python'])
   

解释:QAQ

几种访问方式

#words.items()赋key和value给前面两个值

#words每次赋给word一个key
>>> for word in words:
   print('%s' % word)

python
c++
Java

#words.keys()每次赋给word一个key
>>> for word in words.keys():
   print('%s' % word)

python
c++
Java

#words.values()每次赋给meaning一个value
>>> for meaning in words.values():
   print("%s" % meaning)

QAQ
QwQ
no response

#以key为关键词排序
>>> for word in sorted(words.keys()):
   print("%s : %s" % (word,words[word]))

Java : no response
c++ : QwQ
python : QAQ

添加:直接中括号添加

#def为定义函数
>>> def showMeanings(dictionary):
        for name, meaning in dictionary.items():
            print("\n名称: %s" % name)
            print("解释: %s" % meaning)
>>> showMeanings(words)
   

名称: python
解释: QAQ

名称: c++
解释: QwQ

名称: Java
解释: no response

修改:直接中括号修改

删除:

any = words.pop('string')
del words['string']

修改键名:将原来的值赋给新键,删除旧键

嵌套:值为列表或字典

#值为列表
>>> words = {'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]}
>>> print(words['a'][0])
1

#值为字典
>>> words = {'a':{1:[2,3,4]},'b':{2:[4,7,8]}}
>>> words['a']
{1: [2, 3, 4]}
>>> words['a'][1][2]
4

6.1 函数(Functions)简介

函数的定义

def fun(a,b):
    #It is code in function

fun(c,d)

返回值

使用return返回
用else避免错误返回

练习

Greeter

  • 写下一个函数,参数是一个人的名字,并打印出一条祝福的语句。
  • 用你的函数祝福3个人。
  • 将人名存储在列表中,并且用 for 循环调用函数。
>>> def Greeter(name):
        print("Good luck, %s!" % name)

>>> Greeter("Aaron")
Good luck, Aaron!

>>> Greeter("Bob")
Good luck, Bob!

>>> Greeter("Cindy")
Good luck, Cindy!

>>> names = ["Aaron", "Bob", "Cindy"]
>>> for name in names:
        Greeter(name)

Good luck, Aaron!
Good luck, Bob!
Good luck, Cindy!

Full Names

  • 写下一个函数,参数包括姓和名字,并打印出一条包含全名的语句。
  • 使用不同的参数,调用 3 次你的函数。
>>> def fn(fname,gname):
       print("Hello, %s %s!" % (gname,fname))

>>> names = [["Wang","Aaron"],["Sun", "Bob"], ["Chen","Cindy"]]
       
>>> for a,b in names:
       fn(a,b)
 
Hello, Aaron Wang!
Hello, Bob Sun!
Hello, Cindy Chen!

Addition Calculator

  • 写下一个函数,包含两个数字类型的参数。计算参数的和并打印出参数和它们的和。
  • 调用 3 次你的函数。
>>> def ac(x,y):
       z=x+y
       print(z)

>>> numbers = [[1,2],[3,4], [5,6]]
       
>>> for number in numbers:
       ac(number[0],number[1])
 
3
7
11

Return Calculator

  • 修改 Addition Calculator 中的函数,返回参数的和。并在函数外打印出来。
>>> def ac(x,y):
    z=x+y
    return z

>>> numbers = [[1,2],[3,4], [5,6]]
       
>>> for number in numbers:
       print(ac(number[0],number[1]))

3
7
11

6.2 函数进阶

参数缺省值

def fun(name='s'):
    #It is the code of function

位置与关键字参数

多参数按照位置传递,可以写形参名来乱序传递参数。

如果使用混合位置和关键字参数,需要位置参数在前,关键字参数在后。

接受任意数量的参数

Python的参数,顺序为位置参数,一星任意数量参数,强制关键词参数,两星多关键词参数,可以单独一星使后面的变为强制关键字参数。

7.1 类(Classes)

>>> class One():
    def __init__(self):
        self.x=0
        self.y=0
    def move(self,xx,yy):
        self.x+=xx
        self.y+=yy
    def show(self):
        print("(%d,%d)" % (self.x,self.y))

>>> ones = [One() for i in range(0,5)]
>>> for i in range(0,5):
    ones[i].move(i,i*i)
    ones[i].show()

(0,0)
(1,1)
(2,4)
(3,9)
(4,16)

7.2 面向对象基础

常用术语

class:类。类是代码块的主体,其中定义了建立的模型的属性和行为。这个模型可以来自于真实世界,也可以是虚拟游戏等。
attribute:属性。是一系列信息的集合。在类中,一个属性通常是一个变量。
behavior:行为。行为是定义在类中,组成方法的部分。也即是定义在类中函数的一部分。
method:方法。类中的函数,由 behavior 组成。
object:对象。对象是类的实例。一个对象中包含所有类中属性的值。你可以为一个类创建任意数量的对象。

One类

init()方法

类名的命名规则和变量的相同,但是 Python 中有一个约定好的规则,类名必须是驼峰式的。也即每个单词的开头必须是大写的,不允许下划线的出现。类名后紧跟一对圆括号,目前为止圆括号里都是空的,接下来的学习中,其中可能会包含一个类。这个类是新类基于的类。

init()初始化函数。

self对当前对象的引用。

创建多个对象
#第一种方法
ones = []
for x in range(0,5):
    new_one = One()
    ones.append(new_one)
#第二种方法
ones = [One() for i in range(0,5)]

7.3改进类

init()、方法中接受参数,添加新方法

7.4 继承(Inheritance)

面向对象程序设计最重要的目的之一就是创建稳定的,可靠的,可重用的代码。如果你为每个对象都创建一个新类,你也很难写出可重用的代码。
在 Python 和任意支持面向对象编程的语言中,一个类可以继承另一个类。这也意味着你可以在旧类的基础上创建新类。新类继承旧类中所有的属性和行为。
新类可以重写覆盖任一继承自旧类的属性或行为。也可以添加新的属性和行为。旧类被称为父类,新类被称为父类的孩子。父类也被称为 superclass ,子类被称为 subclass。
子类继承父类的所有属性和行为,但在子类中定义的属性和行为不能为父类所用。这虽然看起来很明显,但也有必要说明一下。
这也以为着子类可以重写父类中的方法。如果子类中定义了一个已经在父类中出现的方法,子类对象会调用子类的方法而不是父类的。

子类中填写父类的类名,初始化函数中用super().init()初始化父类

随机数

from random import randint
s=randint(0,100)

7.5 模块(Modules)和类

当你将类存储在一个单独的文件中时,这个文件就被称为一个模块(module)。在一个模块中可以写入任意数量的类。而且有很多方式在程序中导入模块中的类。
接着所学类的知识,我们将 Rocket 类存进一个称之为 rocket.py 的文件。需要注意的是,模块的名字是小写的单词,类名是以大写字母开头的。

在模块中储存类

我们将One类存进一个称之为one.py的文件。需要注意的是,模块的名字是小写的单词,类名是以大写字母开头的。

from one import One,(Other_class)
new_one = One()

from one import *
new_one = One()

import one
new_one = one.One()

import one as (other_name)
new_one = (other_name).One()
#注意重名问题

在模块中储存函数

与储存类相同

8 异常(Exceptions)

try/except as/else/finally异常处理

#计算器
class Calculator():
        muffled = True
        #默认抑制错误信息
        flag = True
        #退出标记
        def __init__(self):
                print("Let's start! Press Ctrl+c to exit.\n")
        def calculation(self):
                #计算函数
                try:
                        self.flag = True
                        self.a = input("Please input an expression.\n")
                        print("ans = %d" % eval(self.a))
                except (ZeroDivisionError, TypeError) as e:
                        if not self.muffled:
                                print(e)
                        print("Your number is bogus!\nPlase try again!\n")
                except KeyboardInterrupt:
                        self.flag = False
                        print("Good luck!")
                except Exception as e:
                        if not self.muffled:
                                print(e)
                        print("Something is wrong!\nPlase try again!\n")
                else:
                        print("Successful calculation!\n")
                finally:
                        if self.flag:
                                self.calculation()
        def change(self):
                #改变抑制错误信息的状态
                self.muffled = not self.muffled

raise自定义异常

异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
LookupError 无效数据查询的基类
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告

with/as

工作原理(加粗名字两边各有两条下划线)

  • 上下文管理器必须包含 enterexit 方法。
  • enter 方法被自动调用,如果存在 as 子句,返回值就被赋值给 as 后的变量,没有就直接丢弃。
  • 嵌套在 with 语句下的代码被执行。
  • 如果 with 语句中的代码抛出异常, exit(type, value, traceback) 方法就会被调用。参数值是和 sys.exc_info() (Python 内置函数)函数返回值相同的值。如果这个方法返回了一个 false 值,异常就会被重新抛出,否则异常终止。异常重新抛出是以常规方式抛出的,因此在 with 语句外捕获。
  • 如果 with 语句里的代码块没有抛出异常,exit 方法仍旧会被调用,但是参数会被置为 None。
class TraceBlock:
    def message(self, arg):
        print('running ' + arg) 
        
    def __enter__(self):
        print('starting with block')
        return self
    
    def __exit__(self, exc_type, exc_value, exc_tb):
        if exc_type is None: 
            print('exited normally\n')
        else:
            print('raise an exception! ' + str(exc_type)) 
            return False # Propagate

with TraceBlock() as action: 
    action.message('test 1')
    print('reached')

with TraceBlock() as action: 
    action.message('test 2') 
    raise TypeError()
    print('not reached')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容