一、内置函数

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 函数:

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 += ' '

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:])

以上便是本次的全部内容,大家可以亲自编程练练手。更多精彩内容,关注微信公众号:Python高效编程。

python基本使用-Python 基本用法相关推荐

  1. Python进阶之递归函数的用法及其示例

    作者 | 程序员adny 责编 | 徐威龙 封图| CSDN│下载于视觉中国 出品 |  AI科技大本营(ID:rgznai100) 本篇文章主要介绍了Python进阶之递归函数的用法及其示例,现在分 ...

  2. Python assert断言函数及用法

    Python assert断言函数及用法 Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Pyt ...

  3. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  4. (Python)numpy的argmax用法

    (Python)numpy的argmax用法 解释 还是从一维数组出发.看下面的例子. import numpy as np a = np.array([3, 1, 2, 4, 6, 1]) prin ...

  5. Python之Selenium的爬虫用法

    Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾经是 Selenium 的竞争对手).也就是说 Sel ...

  6. python字符串find函数-python字符串查找函数的用法详解

    python字符串查找函数的使用 打开Python开发工具IDLE,新建"findstr.py'文件,并写代码如下: s ='/ab/bx,.s' print (s.find('/x')) ...

  7. python装饰器原理-Python装饰器原理与用法分析

    这篇文章主要介绍了Python装饰器原理与用法,结合实例形式分析了Python装饰器的概念.原理.使用方法及相关操作注意事项,需要的朋友可以参考下 本文实例讲述了Python装饰器原理与用法.分享给大 ...

  8. python装饰器原理-python装饰器原理与用法深入详解

    本文实例讲述了python装饰器原理与用法.分享给大家供大家参考,具体如下: 你会Python嘛? 我会! 那你给我讲下Python装饰器吧! Python装饰器啊?我没用过哎 以上是我一个哥们面试时 ...

  9. python中index函数_详解python中的index函数用法

    1.函数的创建 def fun(): #定义 print('hellow') #函数的执行代码 retrun 1 #返回值 fun() #执行函数 2.函数的参数 普通参数 :要按照顺序输入参数 de ...

  10. python控制画笔尺寸,Python画笔的属性及用法详解

    画笔有颜色.画线的宽度等属性. 1.turtle.pensize():设置画笔的宽度: 2.turtle.pencolor():没有参数传入返回当前画笔颜色:传入参数设置画笔颜色,可以是字符串如&qu ...

最新文章

  1. iOS 应用发布到AppStore流程
  2. 最新综述 | 基于深度学习的立体视觉深度估计
  3. .Net定时弹出窗口(c#)
  4. JFileChooser多选、选择目录
  5. poj 3038 Children of the Candy Corn bfs dfs
  6. 需要某个字体包才能正确显示此页面_如何做设计,才能做好设计
  7. “Internet Explorer无法打开站点,已终止操作”解决
  8. [轉]javascript 的 location 各種用法
  9. 郁闷的开始--8月21日
  10. .net工作流框架,拖拽式表单设计,仿钉钉流程设计
  11. ICCV7 For AVR 使用教程 Atmega16 单片机
  12. 赢在微创新_小米用互联网颠覆中国市场的内幕与方法
  13. web中常用的20种字体 (share)
  14. 微信扫码登录自定义二维码显示信息
  15. c语言井字棋程序设计报告,井字棋游戏(课程设计)总结报告.doc
  16. S型速度曲线_博图+变频器+三相异步电机(以堆垛机控制系统举例)
  17. 新闻列表中,常用的文字超出后显示省略号..
  18. [转载]别让用户发呆—设计中的防呆策略
  19. 智慧物联下主机加固安全解决方案分析
  20. linux系统查看日历

热门文章

  1. RHEL/CentOS/Fedora各种源(EPEL、Remi、RPMForge、RPMFusion)配置
  2. 0,1,2,3,2,1,0,1,2,3,2,1,0,...
  3. 帮助子女养成良好的读书习惯 胜过1000亿财富
  4. intellij idea建立maven项目
  5. Building and running Node.js for Android
  6. HIGHGUI ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
  7. 第三次冲刺阶段第五天
  8. CodeForces 396C 树状数组 + DFS
  9. OpenCV源码中Haar训练及特征提取的代码说明
  10. FreeSwitch Sip【转】