花了一晚上时间,终于把Python的基本用法归纳好了!
off999 2024-10-18 08:05 30 浏览 0 评论
一、内置函数
1. complex([real[,imag]])
返回一个复数,实部 + 虚部*1j,或者把字符串或者数字转成复数形式。
参数可以是复数表达式,也可以是字符串。当参数是字符串的时候,数字与操作符之间不能有空格。即comple('1 + 2j')是错误的。
print(complex(1, 2))
print(complex(1 + 2j))
print(complex('1+2j'))
# 输出 1+2j
print(complex(1))
# 输出 1+0j
满足:实部 + 虚部*1j 的数被称为复数。
a = 1 + 3j # 求实部 print(a.real) # 求虚部 print(a.imag) # 求共轭 print(a.conjugate())
2. chr(i) 与 ord(i)
chr(i) 是将当前整数 i 转成对应的 ascii 字符,可以是十进制,也可以是十六进制,其中0 <= i <= 0x10ffff (1114111)。其对应的逆操作为 ord(i),i 为 ascii 字符。
下面的函数演示如何求一个可迭代对象的 ascil字符 或者其对应的数值。注意函数 ordplus ,参数 x 中的每一个元素必须是单个字符,如果是列表,形式如下:[‘P’ , ‘y’, ‘t’ , ‘h’, ‘o’ , ‘n’]。
def chrplus(x): chr_string = '' for elem in x: chr_string += chr(elem) return chr_string def ordplus(x): ord_list = [] for elem in x: ord_list.append(ord(elem)) return ord_list x = 'Python高效编程' temp = ordplus(x) print(temp) # 输出:[112, 121, 116, 104, 111, 110, # 39640, 25928, 32534,31243] init = chrplus(temp) print(init) # 输出:Python高效编程
3.enumerate(iterable, start=0)
返回 enumerate 对象。迭代对象必须是序列,迭代器,或者其他支持迭代的对象。enmerate() 函数返回的是迭代器,同样是可迭代对象。每次迭代的元素,都包含元素在序列里的序号(strat 默认值为 0) 和元素对应值。因此,我们可以用 for 循环获取返回值。
等价于:
def enumerate(sequence, start=0): n = start for elem in sequence: yield n, elem n += 1 for i, elem in enumerate(['P', 'y', 't', 'h', 'o', 'n']): print(i, elem)
4. abs(x)
返回数的绝对值。参数可以是整数或者浮点数。如果参数是复数,返回复数的模。Python 中虚数用数值加上字符 j 的形式表示。要注意 j 前面的数值不能省略,比如 1j。
下面是我写的简易版的 abs 函数:
进群:960410445 即可获取数十套PDF!
from math import sqrt def naive_abs(x): # isinstance 判断参数x是否为整数或浮点数 if isinstance(x, int) or isinstance(x, float): if x < 0: x = - x # 判断参数x是否为复数 elif isinstance(x, complex): # x.real 复数的实部 # x.imag 复数的虚部 real = x.real imag = x.imag # 求复数的模 x = sqrt(real ** 2 + imag ** 2) else : return '请输入 int float complex' return x print(abs(3+4j)) print(naive_abs(3+4j)) # 输出 5.0 print(abs(-6)) print(naive_abs(-6)) # 输出 6
二、算法与数据结构
1. 二分查找
要想使用二分搜索,首先要确保迭代序列是有序的。对于无序序列,我们首先要进行排序操作。
每次循环缩小一半搜索范围,时间复杂度为 O(logn)。每次循环,比较选取的中间数与需要查找的数字,如果待查数小于中间数,就减少右界至中间数的前一个数;如果待查数大于中间数,就增加左界到中间数后一个数;如果待查数等于中间数,返回中间数的下标,该下标即为待查数在序列中的位置。当左界大于右界时,循环结束,说明序列中并没有待查数。
def binary_search(item, find): # 有序可迭代对象 left, right = 0, len(item) - 1 mid = left + (right - left) // 2 while left <= right: if item[mid] == find: return mid elif item[mid] > find: right = mid - 1 else: left = mid + 1 mid = left + (right - left) // 2 return None seq = [1, 4, 7, 9, 13, 17, 18, 21, 34, 45, 65] binary_search(seq, 13) # 输出:4
2. 快速排序
首先要打乱序列顺序 ,以防算法陷入最坏时间复杂度。快速排序使用“分而治之”的方法。对于一串序列,首先从中选取一个数,凡是小于这个数的值就被放在左边一摞,凡是大于这个数的值就被放在右边一摞。然后,继续对左右两摞进行快速排序。直到进行快速排序的序列长度小于 2 (即序列中只有一个值或者空值)。
# quicksort import random def quicksort(seq): if len(seq) < 2: return seq else: base = seq[0] left = [elem for elem in seq[1:] if elem < base] right = [elem for elem in seq[1:] if elem > base] return quicksort(left) + [base] + quicksort(right) seq = [9, 8, 7, 6, 5, 4, 3] random.shuffle(seq) # seq:[6, 4, 9, 3, 8, 5, 7] print(quicksort(seq)) # 输出:[3, 4, 5, 6, 7, 8, 9]
3. 冒泡排序
冒泡排序(顺序形式),从左向右,两两比较,如果左边元素大于右边,就交换两个元素的位置。其中,每一轮排序,序列中最大的元素浮动到最右面。也就是说,每一轮排序,至少确保有一个元素在正确的位置。这样接下来的循环,就不需要考虑已经排好序的元素了,每次内层循环次数都会减一。其中,如果有一轮循环之后,次序并没有交换,这时我们就可以停止循环,得到我们想要的有序序列了。
def bouble_sort(sequence): seq = sequence[:] length = len(seq) - 1 i = j = 0 flag = 1 while i < length: j = 0 while j < length - i: if seq[j] > seq[j + 1]: seq[j], seq[j + 1] = seq[j + 1], seq[j] flag = 0 j += 1 if flag: break i += 1 return seq
4. 选择排序
选择排序,每次选择当前序列的最小值,将其与当前序列的第一个元素交换位置,每迭代一次,当前序列长度减一。迭代结束,即可得到有序序列。
def find_minimal_index(seq): min_elem = seq[0] count = 0 min_elem_index = count for elem in seq[1:]: count += 1 if elem < min_elem: elem, min_elem = min_elem, elem min_elem_index = count return min_elem_index def select_sort(sequence): # 选择排序 seq = sequence[:] length = len(seq) for i in range(length): index = find_minimal_index(seq[i:]) seq[index + i], seq[i] = seq[i], seq[index + i] return seq
5. 去重序列重复元素
首先新建一个集合 set,对于序列中的元素,如果已经在集合中了,我们就不返回这个值。如果不在集合中,就向集合添加这个元素,并返回这个值。key 是函数名,通过修改 key,我们可以改变重复元素的判断依据。比如对于下面这个序列:a = [{'a': 6, 'b': 4}, {'a': 6, 'b': 3}, {'a': 6, 'b': 4},{'a': 8, 'b': 12}]list(dedupe(a, lambda x: x['a']))这里我们把 dedupe 设置为,基于关键字 ‘a’ 对应值去除重复元素,也就是说集合中添加的元素为关键字 ‘a’ 对应值。输出为:[{'a': 6, 'b': 4}, {'a': 8, 'b': 12}]list(dedupe(a, lambda x: (x['a'],x['b'])))这里,集合添加的是关键字’a’和’b’对应值的元组。
输出为: [{'a': 6, 'b': 4}, {'a': 6, 'b': 3}, {'a': 8, 'b': 12}]
# Python高效编程 def dedupe(sequence, key): # 依序去除重复元素 seen = set() items = sequence[:] for item in items: if key: seq = key(item) if seq not in seen: seen.add(seq) yield item
6. Vector
这一节,我们来实现一个简单的 Vector 类。Vector 类有两个属性,为 x,y 坐标,即对应向量的横纵坐标。首先,实现重载 + 号的方法def __add__,及实现两个向量的加法。具体做法是:将加号两边的 Vector 对象的 x, y值相加,得到新的 x, y值并且返回一个新的向量对象。__sub__方法实现了 Vector 对象的减法,和加法差不多。让向量对象的对应属性相减,并返回新的向量对象。__ads__方法,使得可以对实例进行 ads操作(即取横纵坐标的模)。__mul__方法,使得实例可以通过乘法进行伸缩的操作。__repr__与__str__方法使得打印对象更加美观。
import math
# Python高效编程
class Vector(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x, y)
def __sub__(self, other):
x = self.x - other.x
y = self.y - other.y
return Vector(x, y)
def __abs__(self):
return math.sqrt(self.x ** 2 + self.y ** 2)
def __bool__(self):
return bool(self.x or self.y)
def __mul__(self, times):
return Vector(self.x * times, self.y * times)
def __repr__(self):
return 'Vector({}, {})'.format(self.x, self.y)
__str__ = __repr__
def main():
v1 = Vector(3, 5)
v2 = Vector(4, 5)
v3 = v1 + v2
v4 = v3 * 2
v5 = v2 - v1
print(v3)
print(v4)
print(abs(v3))
print(v5)
if __name__ == '__main__':
main()
# 输出:
# Vector(7, 10)
# Vector(14, 20)
# 12.206555615733702
# Vector(1, 0)
7. 具名元组
具名元组(namedtuple) 是 python 标准库 collections 中的工厂函数。它接受两个参数,第一个参数表示类的名称,第二个参数是类的字段名。后者可以是可迭代对象,也可以是空格隔开的字符串。然后,我们通过一串参数的形式将参数传递到构造函数中。这样,我们既可以通过字段名访问元素,也可以用索引访问元素。
from collections import namedtuple
ToDo = namedtuple('ToDo', 'date content priority')
t = ToDo(12, 'null', 1)
print(t.date)
print(t[1])
# 输出:
# 12
# null
下面是具名元组的演示程序:我们创建了一个 ToDoList 类,并且支持 + 、索引、切片与显示等操作。并且通过格式化输出,美化打印结果。
from collections import namedtuple
ToDo = namedtuple('ToDo', 'date content priority')
class ToDoList:
def __init__(self):
self.item = []
def add(self, date, content, priority):
self.item.append(ToDo(date, content, priority))
def _modify(self, item):
self.item = item
@property
def _getitem(self):
return self.item
def __getitem__(self, pos):
return self.item[pos]
def __add__(self, other):
item = self._getitem + other._getitem
t = ToDoList()
t._modify(item)
return t
def __repr__(self):
items = self._getitem
text = '{:<5}{:^10}{:^10}'.format('date', 'content', 'priority')
fmt = '{:<5}{:^10}{:^10}'
for item in items:
text += '\n'
text += fmt.format(item.date, item.content, item.priority)
return text
__str__ = __repr__
def main():
t1 = ToDoList()
t1.add(12, 'play', 0)
t1.add(8, 'seek', 6)
t2 = ToDoList()
t2.add(4, 'sleep', 2)
t3 = t1 + t2
print(t3)
if __name__ == '__main__':
main()
# 输出
# date content priority
#12 play 0
#8 seek 6
# 4 sleep 2
三、递归
1. 阶乘
迭代停止条件:n < 2
# 阶乘 # n > 0 def factor(n): return 1 if n < 2 else n * factor(n-1)
2. 序列和
迭代停止条件:序列为空
# 和 def naive_sum(seq): if not seq: return 0 else: return seq[0] + naive_sum(seq[1:])
3. 求序列长度
迭代停止条件:序列为空
# 计数 def naive_count(seq): if not seq: return 0 else: return 1 + naive_count(seq[1:])
4. 求序列最大值
迭代停止条件:序列为空
# 最大值 count = 1 def naive_max(seq): global count global max_num if count: max_num = seq[0] count = 0 if not seq: count = 1 return max_num else: if seq[0] > max_num: seq[0], max_num = max_num, seq[0] return naive_max(seq[1:])
以上便是本次的全部内容,大家可以亲自编程练练手。
相关推荐
- win7sp1专业版(win7专业版vl)
-
Win7系统SP1是系统发布后第一个SP包x64是64位操作系统。Windows7指的是微软公司的Windows7操作系统ultimate指的是旗舰版(with表示伴随,说明这是提供商所提供...
- 手写输入法手写板怎么设置(手写输入法手写板怎么设置 iphone)
-
手写输入法设置方法:1、打开手机至桌面主页,保持手机处于工作状态; 2、在手机桌面主页列表找到设置,点击打开并进入设置主界面; 3、在设置主界面找到系统设置选项,点击打开并进入系统设置主界面; ...
-
- 推荐杀毒软件(下载杀毒软件最新版)
-
好的杀毒软件有360杀毒,金山毒霸,AVG杀毒等等。1,360杀毒,品牌介绍:360安全卫士品牌是一款由奇虎360公司推出的功能强、效果好、受用户欢迎的安全杀毒软件。360安全卫士拥有查杀木马、清理插件、修复漏洞、电脑体检、电脑救援、保护隐...
-
2025-11-12 08:51 off999
- 百度云盘官网(百度云盘官网下载)
-
网盘在手机上面仅仅是一个图标,他是不占用手机硬盘的,当然,如果你从网盘上下载了文件到本地,下载的文件就会占用手机的硬盘空间。要找到这个文件,可以通过文件管理器来进行查找,也可以通过路径的方式来查找,但...
-
- 路由器设置管理系统(路由器设置管理员密码怎么设置)
-
电脑端:把华为路由器接通电源,并开启WIFI,如果你使用电脑PC端,请使用网线连接路由器;成功连接到路由器之后,打开电脑浏览器,在浏览器中输入IP地址:192.168.3.1即可进入华为路由器管理界面;进入我要上网页面。在上网方式下拉框中,...
-
2025-11-12 07:51 off999
- win10家庭版密钥在哪里看(windows10家庭版密钥在哪里)
-
要查看Windows10系统的激活密钥,请按照以下步骤操作: 1.点击“开始”菜单,然后选择“设置”(齿轮图标)。 2.在“设置”窗口中,选择“更新和安全”。 ...
- 两个wifi路由器怎么连接(两个wifi路由器设置方法)
-
无线路由器再连接一个无线路由器的设置方法如下:一、主路由器设置方法:先将网线(总线)插在无线路由器的WAN口,用一条网线一头插入无线路由器的任意LAN口一头连接电脑网卡,开启路由器的电源。电脑打开浏览...
- windows7的安装过程(windows7安装步骤有哪些)
-
安装教程注意事项:1、本系统可以直接安装,不需要制作U盘启动盘,适合能正常开机的电脑。2、安装系统后C盘(包括桌面)数据会丢失,重要的东西请自行备份。3、此安装方法只适用于当前系统为XP、Win7、W...
- 惠普打印机插件手机版(惠普打印插件app)
-
您好,感谢您选择惠普产品。不是所有的打印机都可以实现手机打印功能的。一般来说支持ariprint的打印机,并且手机也有该功能,才能实现打印功能。如果您不需要实现打印功能,那么这个插件对您来说可能用处不...
- 电脑热点怎么禁止别人连接(怎么让电脑的热点不被关闭)
-
方法/步骤1/7首先,在我们的屏幕上找到“设置”。2/7点击进入设置之后,正数第三位就是个人热点。3/7在个人热点中,我们可以设置热点密码,开启关闭热点。4/7排名第三的是连接管理,可以设置允许一个至...
- 常用浏览器有哪些
-
电脑常用浏览器好用的方法步骤1从用户体验和功能扩展性来看,Chrome是最好用的浏览器。2Chrome拥有快速的页面加载速度、优秀的标签页管理和内置的开发者工具等功能,还有不断更新的扩展程序,能够...
- u盘怎么取消读写保护(优盘怎么去掉读写保护)
-
如果您的U盘启动了读写保护,那么就无法进行数据的读取和写入操作。以下是一些可能的解决方法:1.检查开关或按钮:一些U盘有物理开关或按钮,用于启用或禁用读写保护。您可以检查一下U盘上是否有这样的开关或...
-
- 打印机脱机无法打印怎么办(打印机脱机无法打印故障处理)
-
打印机脱机无法打印怎么办?在使用打印机的过程中,经常会遇到打印机无法打印的问题,如果你的打印机已经正常使用了一段时间,而是现在打印机无法打印了,那么很可能是你的打印机脱机了。我们该怎么办呢?首先我们拿到打印机,要把它的电源线,USB打印线与...
-
2025-11-12 03:51 off999
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
