欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

DataWhale_python训练营task1

程序员文章站 2023-10-28 20:44:04
一. Task01: 变量、运算符、数据类型及位运算(2天)理论部分了解python中基本的变量类型,运算符,及数据类型。了解python的位运算练习部分课后思考题leetcode练习题1.注释# 单行注释'''多行注释'''2.变量变量类型整型:Python中可以处理任意大小的整数(Python 3.x中整数只有int这一种了),而且支持二进制(如0b100,换算成十进制是4)、八进制(如0o100,换算成十进制是64)、十进制(100)和十六进制(0x100,换算...

一. Task01: 变量、运算符、数据类型及位运算(2天)

理论部分

  • 了解python中基本的变量类型,运算符,及数据类型。
  • 了解python的位运算

练习部分

  • 课后思考题
  • leetcode练习题

1.注释

# 单行注释
'''
多行注释
'''

2.变量

变量类型

  • 整型:Python中可以处理任意大小的整数(Python 3.x中整数只有int这一种了),而且支持二进制(如0b100,换算成十进制是4)、八进制(如0o100,换算成十进制是64)、十进制(100)和十六进制(0x100,换算成十进制是256)的表示法。
  • 浮点型:浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,浮点数除了数学写法(如123.456)之外还支持科学计数法(如1.23456e2)。
  • 字符串型:字符串是以单引号或双引号括起来的任意文本,比如'hello'"hello"(用三个单引号或三个双引号开头,三个单引号或三个双引号结尾)。
  • 布尔型:布尔值只有TrueFalse两种值,要么是True,要么是False,在Python中,可以直接用TrueFalse表示布尔值(请注意大小写),也可以通过布尔运算计算出来(例如3 < 5会产生布尔值True,而2 == 1会产生布尔值False)。
  • 复数型:形如3+5j,跟数学上的复数表示一样,唯一不同的是虚部的i换成了j。实际上,这个类型并不常用,大家了解一下就可以了。

变量命名
硬性规则:

  • 变量名由字母(广义的Unicode字符,不包括特殊字符)、数字和下划线构成,数字不能开头。
  • 大小写敏感(大写的a和小写的A是两个不同的变量)。
  • 不要跟关键字(有特殊含义的单词,后面会讲到)和系统保留字(如函数、模块等的名字)冲突

PEP 8要求:

  • 用小写字母拼写,多个单词用下划线连接。
  • 受保护的实例属性用单个下划线开头。
  • 私有的实例属性用两个下划线开头。

变量类型转换

  • 使用int(),float(),str(),chr(),ord()进行类型转换

  • bool(X) X为数据类型时,只要值不为0,则为True。X为容器类型:集合、元组、列表、字典时,只要不为空,则为True

  • 利用type()isinstance(object, class)来判断变量类型,isinstance更佳,因为承认父类继承关系

3.运算符

运算符 描述
[] [:] 下标,切片
** 指数
~ + - 按位取反, 正负号
* / % // 乘,除,模,整除
+ - 加,减
>> << 右移,左移
& 按位与
^ | 按位异或,按位或
<= < > >= 小于等于,小于,大于,大于等于
== != 等于,不等于
is is not 身份运算符
in not in 成员运算符
not or and 逻辑运算符
= += -= *= /= %= //= **= &= |= ^= >>= <<= (复合)赋值运算符

注意:
1.is is not 代表对比的是两个变量的内存地址, ==, != 对比的是两个变量的值。
容器类型地址可变,数据类型地址不变,故使用 ==, != 更佳。
2.特殊三元运算符:

small = x if x < y else y

3.一元运算符优于二元运算符,如正负号。
先算术运算,后移位运算,最后位运算。
逻辑运算最后结合。

4.位运算

原码、反码和补码
计算机中按照补码保存数据。

正数 负数
原码 符号位正为0 负为1
反码 原码 对应正数取反
补码 原码 对应正数取反加一

位运算符

运算符 描述
~ 按位非
| 按位或
& 按位与
^ 按位异或
<< 按位左移
>> 按位右移

利用位运算实现快速运算

  • 通过 << , >> 快速计算2的倍数问题
n << 1 # -> 计算 n*2
n >> 1 # -> 计算 n/2,负奇数的运算不可用
n << m # -> 计算 n*(2^m),即乘以 2 的 m 次方
n >> m # -> 计算 n/(2^m),即除以 2 的 m 次方
1 << n # -> 2^n
  • 通过 ^ 快速交换两个整数。
a ^= b
b ^= a
a ^= b

原理:
假定下边等式中的等号右侧的a和b为初始固定值。由于多个数进行异或运算的值只与1的个数有关,1的个数为奇数则结果为1,1个数为偶则结果为0。
b = b ^ a ^ b b^b 每一位的1个数都为偶数,故结果只取决于a, 即最终达到 b = a
下边再看第三行代码,a = a ^ b, 此时的a 为初始的a ^ b,而此时的b为初始的a,同理最终实现将b的初始值赋给a,从而实现值的交换。

  • 通过 a & (-a) 快速获取 a 的最后为 1 位置的整数。

原理:a和-a为一正一负,假定a为正,-a为负(反之结果相同),故a为原码,-a为a原码取反加一,两者相与的话结果几乎全为0,只有加一的地方会不同。观察最后为1位置,取反加一后此处也为1,故与后该位仍为1,故最终结果为 a 的最后为 1 位置的整数。

利用位运算实现整数集合
一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。
比如集合 {1, 3, 4, 8} 可以表示成 01 01 10 00 10 而对应的位运算也就可以看作是对集合进行的操作。

0 1 2 3 4 5 6 7 8 9
0 1 0 1 1 0 0 0 1 0

集合与元素的操作

a | (1<<i) -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 从集合中删除
a & (1<<i) -> 判断 i 是否属于该集合(零不属于,非零属于)

集合之间的操作

a 补 -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)

练习题1

  • 怎样对python中的代码进行注释?
    使用#+空格号进行单行注释。
  • python有哪些运算符,这些运算符的优先级是怎样的?
    包含算术运算符,逻辑运算符,比较运算符、位运算符和其他运算符。
    优先级:
    一元运算符 > 二元运算符
    算术运算符 > 移位运算 > 位运算
    逻辑运算最后进行
  • python 中 is , is not== , != 的区别是什么?
    is notis比较的是数据的内存地址,==!=比较的数据本身。
  • python 中包含哪些数据类型?这些数据类型之间如何转换?
    整型、浮点型、字符串型、布尔型、复数型。
    使用int(),float(),str(),chr(),ord()进行类型转换。

练习题2

  • 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。尝试使用位运算解决此题。
思路:利用异或运算的特性,任何数与本身相异或为0,任何数和0相异或为本身,故出现两次的数不产生影响,将全部的数异或便可以得到剩余的单个数。

"""
Input file
example1: [2,2,1]
example2: [4,1,2,1,2]
Output file
result1: 1
result2: 4
"""
class Solution:
 def singleNumber(self, nums: List[int]) -> int:
 	a = 0
    for num in nums:
        a ^= num
    return a
  • 解题过程中的教训:
    a.不要钻牛角尖
    b.a^num并不会改变a的值,记得写等号a^=num

本文地址:https://blog.csdn.net/qq_29380039/article/details/107442059