Python学习笔记

本文详细介绍了Python的基本概念,包括数据结构的索引与分片、输出中文的方法、注释的使用方式、变量传递机制、类与对象的操作、异常处理以及线程的创建与使用等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 索引和分片

1.1 字符串、列表和元组

字符串、列表、元组都可以通过[]进行索引和分片,其中,第一个元素的索引为0。而且在索引和分片中可以使用负数,此时,-1表示最后一个元素,-2表示倒数第二个元素,一次类推。

需注意的是,listtuple的分片操作的结果仍是listtuple,即使结果中只有一个元素,而listtuple的索引操作的结果为元素类型,如下:

      alist = [1, 2, 3, 4, 5]

      print alist[0], alist[0:1]

      atuple = (1, 2, 3, 4, 5)

      print atuple[0], atuple[0:1]

      运行结果为:

      1 [1]

1 (1,)

而对于字符串,因为其元素也为字符串类型(python中没有字符类型),所以索引和分片的结果的类型是一样的。如下:

1 1

1.2 字典

      字典不是通过位置进行索引的,而是通过“键”进行索引的,索引的结果为对应的值。如下:

      adic = {1:'beijing', 2:'shanghai', 3:'tianjin'}

for i in range(1,4):

          print adic[i]

      输出的结果为:

      beijing

shanghai

tianjin

注意:因为字典是无序的,所以字典不能通过位置进行索引,而且字典也没有分片操作。

2. .py文件中输出中文

      python的命令行(python.exe)或者自带的shell中可以不加处理地输出中文。在.py文件中输出中文,须在文件的第一行加:#-*- coding:cp936 -*-,意思是文件代码使用cp936编码标准进行保存。

因为windows的命令行(cmd.exe)采用的是cp936编码标准,所以采用cp936标准可以在windows的命令行中直接输出中文。也可以采用其他的编码标准,比如文件的第一行可以为 #-*- coding:uft-8 -*-,此时,在windows命令行中正确地输出中文需进行其他处理,如下:

s = ‘汉字

print s.decode(‘utf-8’).encode(‘cp936’)

3. 关于python的注释

      除用字符#添加注释外,还可以通过定义字符串的方式来添加注释(实际上是定义了没有名字的字符串),如下:

      for i in range(1, 5+1): # comment

           ‘comment-1’

           “comment-2”

           ‘’’comment-3’’’

           “””comment-4”””

           print i

      需要注意的是,第二种添加注释的方法实际上是定义了不被引用的字符串,所以可适用的情况有限。

4. 传递引用or传值

      Python中,传递整数类型时是传值,传递列表类型时是传递引用,如下:

      i1 = 123

i2 = i1

i2 = 100

print i1, i2

结果为 123 100

list1 = range(6)

print list1

list2 = list1

list2.reverse()

print list1, list2

      结果为:

      [0, 1, 2, 3, 4, 5]

[5, 4, 3, 2, 1, 0] [5, 4, 3, 2, 1, 0]

5.

5.1 对象的初始化相关

      类可以直接修改类中的属性,这将会影响该类的未赋值且未用__init__方法初始化的对象,而不会影响该类的已赋值的对象或者用__init__方法初始化的对象。如下:

      class Stu_t:

    name = 'null'

    id = 0

 

stu1 = Stu_t()

stu2 = Stu_t()

print stu1.name, stu2.name

 

# Stu_t修改属性name,将影响未赋值的对象stu1stu2

Stu_t.name = 'empty'

print stu1.name, stu2.name

 

stu1.name = 'Alice'

 

print Stu_t.name, stu1.name, stu2.name

 

# Stu_t修改属性name,将影响未赋值的对象stu2 但不影响已赋值的对象stu1

Stu_t.name = 'null'

print Stu_t.name, stu1.name, stu2.name

 

以上程序的输出为:

null null

empty empty

empty Alice empty

null Alice null

示例二如下:

class Stu_t:

    name = 'null'

    id = 0

    def __init__(self, name, id):

        self.name = name;

        self.id = id

    def Print(self):

        print self.name, self.id

stu1 =  Stu_t('Alice', 11)

stu1.Print()

Stu_t.name = 'empty' #修改类的属性不会影响 stu1 的属性值

Stu_t.id = 100

stu1.Print()

程序输出为:

Alice 11

Alice 11

5.2 类的属性与方法

      在类的内部访问类中定义的属性和方法时,前面需要带self.前缀。需要注意,在类内部访问类中定义的方法时,不需要显式地传递self参数。如下:

class Stu_t:

    __name = ''

    __age = 0

    msg = ''

    def __init__(self, name, age, msg):

       self.__name = name

       self.__age = age

          self.msg = msg

    def __CheckAge(self):

       if self.__age > 30:

           return 1

       else:

           return 0

    def Print(self):

       if self.__CheckAge(): #调用类的其他方法时,不需显式地传递self参数

           print self.__name, '"over 30"', self.msg

       else:

           print self.__name, self.__age, self.msg

stu1 = Stu_t('Alice', 24, "Good student!")

stu2 = Stu_t('Bob', 35, "Good teacher!")

stu1.Print()

stu2.Print()

5.2 继承

派生类可以继承基类的共有属性和共有方法,但是不能继承基类的私有属性和私有方法。派生类访问基类的共有属性和共有方法的方式与访问自己的属性和方法的方式一致,即在基类的共有属性和共有方法前面需带.self前缀,而且,调用基类的共有方法时,无需显式传递self参数。

5.3 重定义基类的方法

      在类的继承中,派生类可以重定义基类的方法。在派生类中访问基类中被重定义的形式为:<基类名>.<方法名>(self, ....),需要注意,此时需要显式传递self参数。如下:

class Stu_t:

    __name = 'null'

    __age = 0

    def __init__(self, name, age):

        self.__name = name

        self.__age = age

    def Print(self):

        print self.__name, self.__age,

 

class Master_t(Stu_t):

    __tutor = 'null'

    ''' 调用基类的__init__方法时,显式地传递self参数'''

    def __init__(self, name, age, tutor):

        self.__tutor = tutor

        Stu_t.__init__(self, name, age)

    ''' 调用基类的Print方法时,显式地传递self参数'''

    def Print(self):

        Stu_t.Print(self)

        print self.__tutor

       

aMaster = Master_t('Alice', 24, 'Bob')

aMaster.Print()

程序输出为:

      Alice 24 Bob

6. raise语句

      raise引发异常有三种形式:

           raise <异常名>

           raise <异常名>, <附加数据>

           raise <对象>

      <异常名>通常为字符串,如下:

try:

    assert 0, 'This is a test'

except AssertionError, inst:

    print inst

else:

    print 'No exception'

 

print '----------------------------'

try:

    raise 'MyExcep'

except 'MyExcep':

    print 'Catching "MyExcep"'

else:

    print 'Catching no exceptions'

 

try:

    raise 'MyExcep', 'This is user-defined exception'

except 'MyExcep', excepInfo:

    print 'Catching "MyExcep":', excepInfo

else:

    print 'Catching no exceptions'

      但是,抛出字符串类型的异常是不推荐的。

raise <对象> <对象>可以任何类的对象,不一定是异常类(Exception)的派生类,如下:

class MyExcep_t:

    def __init__(self, info):

        self.info = info

    def __str__(self):

        return self.info

    def Print(self):

        print "I am instance of class MyExcep_t"

 

try:

      ''' raise语句将构造MyExcep_t类型的对象, 'excep #1' 是构造函数的参数 '''

raise MyExcep_t, 'excep #1'

''' inst raise抛出的对象 '''

except MyExcep_t, inst:

    print inst

    inst.Print()

else:

    print 'Catching no exception'

 

try:

      ''' 同样,也是构造MyExcep_t类型的对象,然后抛出 '''

raise MyExcep_t('excep #2')

''' inst raise抛出的对象 '''

except MyExcep_t, inst:

    print inst

    inst.Print()

else:

    print 'Catching no exception'

 

7. 线程

7.1 使用threading模块的Thread类创建线程

      使用threading模块的Thread类创建线程有两种方法,可以派生Thread类,或者通过Thread的构造函数直接创建特定的线程对象,如下:

# -*- coding: cp936 -*-

import time

from threading import Thread

''' 通过继承Thread定义自己的线程类 '''

class MyThread(Thread):

    def __init__(self, name):

        ''' 调用基类的构造函数 '''

        Thread.__init__(self)

        self.name = name

    ''' 重定义基类的run()方法,即线程函数 '''

    def run(self):

        for i in range(3):

            time.sleep(2)

            print self.getName()

           

t1 = MyThread('Thread#1')

t1.start() # 启动线程

 

''' 定义自己的线程函数 '''

def Run(*arg):

    print 'Run():', arg

''' 构造特定的线程对象 '''

t2 = Thread(target = Run, args = (1, 2, 3))

t2.run() # 启动线程

 

 

 

 

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值