一个二分查找的示例:
# 二分查找 示例
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, 66] def binary_search(dataset, find_num):
print(dataset) if len(dataset) > 1:
mid = int(len(dataset) / 2)
if dataset[mid] == find_num: # find it
print("找到数字", dataset[mid])
elif dataset[mid] > find_num: # 找的数在mid左面
print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid])
return binary_search(dataset[0:mid], find_num)
else: # 找的数在mid右面
print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid])
return binary_search(dataset[mid + 1:], find_num)
else:
if dataset[0] == find_num: # find it
print("找到数字啦", dataset[0])
else:
print("没的分了,要找的数字[%s]不在列表里" % find_num) binary_search(data, 66)
关于匿名函数 lambda
#!/usr/bin/env python
# coding:utf-8 # 这段代码
# def calc(n):
# return n ** n
#
#
# print(calc(10)) # 换成匿名函数
calc = lambda n: n ** n
print(calc(3)) ######
# 匿名函数通常用简单逻辑,与其它函数配合使用
lambda x, y, z: (x + 1, y + 1, z + 1) ### 编程的方法论:
# 面向过程
# 函数式
# 面向对象
def foo(name):
print(name) def bar(name):
print("my name is %s" % name) print(foo(bar('aa')))
print('----------------') lis = [333,222,111,11,22,33,44,55,66,888]
print(max(lis)) dic = {'k1': 10, 'k2': 100, 'k3': 30} # print("用max来求dic的最大值:",max(dic.values()))
print("用max来求dic的最大key值:", max(dic))
print(dic[max(dic, key=lambda k: dic[k])])
print('===========') ### 使用map 和匿名函数 求平方
res = map(lambda x: x ** 2, [1, 5, 7, 4, 8]) for i in res:
print(i) print(res, type(res)) ##
listx = [1, 2, 3, 4, 5, 6, 7] # 7 个元素
listy = [2, 3, 4, 5, 6, 7] # 6 个元素
listz = [100, 100, 100, 100] # 4 个元素
list_result = map(lambda x, y, z: x ** 2 + y + z, listx, listy, listz)
print(list(list_result)) # 由于 lambda 中的 z 参数,实际是使用了 listz, 而 listz 里面只有 4 个元素,
# 所以,只执行了 4 个元素的的计算。
学了好几节的东西,放在一起了。
## 高阶函数: 1.函数接收的参数是一个函数名; 2.返回值中包含函数
# 把函数当作参数传递给另外一个函数
# def foo(n):
# print(n)
#
# def bar(name):
# print("My name is %s" % name)
#
# foo(bar)
# foo(bar('alex')) def bar():
print("from bar") def foo():
print("from foo")
return bar foo()() def handle():
print("from handle...")
return handle h = handle()
h() def test1():
print("from test1") def test2():
print('from test2')
return test1() test2() ### 尾调用: 在函数的最后一步调用另外一个函数(不一定是最后一行。)
## 优化:把递归放在最后一步。
map / reduce / filter 跟大数据沾点边
#### map函数,第一个参数是方法,第二个参数是迭代器(可迭代对象)
## python2中,map的结果直接是列表 msg = 'abcdefg'
print(list(map(lambda x: x.upper(), msg))) # 简洁,但可读性很差。 lis = (11, 22, 33, 44, 55, 66,) def abc(x):
return x // 2 + 1 res = map(abc,lis) #也可以传一个自定义的函数
for i in res:
print(i) print(list(map(str,lis))) # 将列表值转为字符串
#!/usr/bin/env python
# coding:utf-8 ## python2中可直接用。但是3中需要导入模块。
from functools import reduce lis = [3,4,5,7,32,22,11]
print(reduce(lambda x,y:x+y,lis)) # 用来合并一个序列
# 带有初始值的 reduce
print(reduce(lambda x,y:x+y, lis, 100))
#!/usr/bin/env python
# coding:utf-8 ### filter函数 用来过滤迭代器,得到过滤出的对象 lis = ['alex_sb', 'abc_tom', 'dadasb', 'jerry', 'hhui_sb'] # 不保留 sb 结尾的元素
res = list(filter(lambda x: not x.endswith('sb'), lis))
print(res) ## 保留以 a 开头的元素
print(list(filter(lambda y:y.startswith('a'),lis))) # filter 练习: 过滤出小于33岁的。
dic = [
{'name':'alex', 'age':99},
{'name':'wpq', 'age':66},
{'name':'bigs', 'age':44},
{'name':'tom', 'age':22},
{'name':'jerry', 'age':33},
] print(list(filter(lambda n: n['age']<=33, dic)))
python中常用的一些内置函数,更详细的内置函数,可参考:http://www.runoob.com/python/python-built-in-functions.html
#!/usr/bin/env python
# coding:utf-8 print(abs(-3)) # 求绝对值 # 所有元素是否不为 0、''、False ,三样都没有,则返回True
# 空列表、元组、字典都为True
print(all(''))
print(all([]))
print(all(()))
print(all({}))
print(all(['','',''])) # 返回false
print(all([2,1,0])) # 返回false # 与all不同,如果有一个非0,非空,非false,则返回True
print(any(['',''])) # 任何一个为真即返回True print(bin(9)) # 转为二进制
print(hex(9)) # 转为16进制
print(oct(9)) # 转为8进制 print(bool('')) name='你好'
## 转码为字节
print(bytes(name,encoding='utf-8'))
print(bytes(name,encoding='utf-8').decode('utf-8')) print(bytes(name,encoding='gbk'))
print(bytes(name,encoding='gbk').decode('gbk')) print(chr(46)) # 转为ascii码 print(divmod(10,3)) # 10除3, 取出商和余 str_dic="{'name':'alex'}"
print(str_dic)
dic = eval(str_dic) # 识别字符串中的字典
print(dic['name']) str2= '1+3+5*2'
print(str2)
print(eval(str2)) # 识别字符串中的表达式,并得出结果 ## 可hash的数据类型即不可变数据类型。 不可hash的即可变类型
## 应用: 检验软件下载的hash
## 不能通过hash值反推原始值 。 name ='alex'
print(hash(name))
print(hash(name))
name = 'sb'
print(hash(name)) print(dir(hash))
print(help(hash)) print(globals()) ## 输出全局变量
print(__file__) ##当前文件路径 def test():
age=19
print(globals())
print('----------------------')
print(locals()) ##输出当前作用域的变量 test()
有一个max的小练习:
#!/usr/bin/env python
# coding:utf-8 dic = {'k11':3000,'k6':5000,'k3':6000,'k4':8000} print(max(dic.keys()))
print(max(dic.values())) # 求出字典中最大值对应的key
print(max(dic, key = lambda k:dic[k])) # max 和 min都支持第二个参数key 以什么为关键字
print(max(dic, key = lambda k:dic[k]),max(dic.values())) # max 和 min都支持第二个参数key 以什么为关键字
其它内置函数:
# print()
# input()
# len()
# type()
# open()
# tuple()
# list()
# int()
# bool()
# set()
# dir()
# id()
# str() # print(locals()) #返回本地作用域中的所有名字
# print(globals()) #返回全局作用域中的所有名字
# ---------- 注意区别下面的关键字------------
# global 变量
# nonlocal 变量 # 迭代器.__next__()
# next(迭代器)
# 迭代器 = iter(可迭代的)
# 迭代器 = 可迭代的.__iter__() # range(10)
# range(1,11)
# print('__next__' in dir(range(1,11,2))) # range是可迭代的,但不是迭代器 # dir 查看一个变量拥有的方法
# print(dir([]))
# print(dir(1))
# 一定要学会使用 dir 和 help 做断网开发
# help 提供帮助
# help(str) # 检测是否可调用 callable
# print(callable(print))
# a = 1
# print(callable(a))
# print(callable(globals))
# def func():pass
# print(callable(func)) # import time
t = __import__('time') # 这种导入方式不常用
print(t.asctime())
print(t.ctime())
# help(t) # 某个方法属于某个数据类型的变量,就用 . 调用
# 如果某个方法不依赖于任何数据类型,就直接调用: 内置函数 和 自定义函数 # f = open('1.复习.py')
# print(f.writable())
# print(f.readable()) # id
# hash - 对于相同可hash数据的hash值在一次程序的执行过程中总是不变的
# - 字典的寻址方式,用到了hash方法
print(hash(12345))
print(hash('hsgda不想你走,assssssssssssssssssssssasdfffffffffffasdnklgkds'))
print(hash('hsgda不想你走,assssssssssssssssssssssssdfffffffffffasdnklgkds'))
print(hash(('', 'aaa')))
# print(hash([])) # 不可hash # ret = input('提示 : ')
# print(ret) print('我们的祖国是花园', end='') # 指定输出的结束符
print('我们的祖国是花园', end='\t')
print(1, 2, 3, 4, 5, sep='|') # 指定输出多个值之间的分隔符 f = open('file', 'w')
print('aaaa', file=f) # 如果给 print 一个文件句柄,则输出到文件
f.close()
import time for i in range(0, 101, 2):
time.sleep(0.06)
char_num = i // 2
per_str = '\r%s%% : %s\n' % (i, '*' * char_num) \
if i == 100 else '\r%s%% : %s' % (i, '*' * char_num)
print(per_str, end='', flush=True) # progress Bar 进度条模块 exec('print(123)')
eval('print(123)')
print(eval('1+2+3+4')) # 有返回值
print(exec('1+2+3+4')) # 没有返回值
# exec和eval都可以执行 字符串类型的代码
# eval有返回值 —— 有结果的简单计算
# exec没有返回值 —— 简单流程控制
# eval只能用在你明确知道你要执行的代码是什么 code = '''for i in range(10):
print(i*'+')
'''
exec(code)
# eval 计算类
# exec 流程类
# compile 交互类 # 使用 compile 编译文本
code1 = 'for i in range(0,10): print (i)'
compile1 = compile(code1, '', 'exec')
exec(compile1) # code2 = '1 + 2 + 3 + 4'
# compile2 = compile(code2,'','eval')
# print(eval(compile2)) # code3 = 'name = input("please input your name:")'
# compile3 = compile(code3,'','single')
# exec(compile3) #执行时显示交互命令,提示输入
# print(name)
# name #执行后name变量有值
# "'pythoner'" # 复数 —— complex
# 实数 : 有理数
# 无理数
# 虚数 :虚无缥缈的数
# 5 + 12j === 复合的数 === 复数
# 6 + 15j # 浮点数(有限循环小数,无限循环小数) != 小数 :有限循环小数,无限循环小数,无限不循环小数
# 浮点数
# 354.123 = 3.54123*10**2 = 35.4123 * 10
# f = 1.781326913750135970
# print(f) # 过长的浮点数会损失一点精度 print(bin(10)) # 二进制
print(oct(10)) # 八进制
print(hex(10)) # 16进制 # print(abs(-5))
# print(abs(5)) print(divmod(7,2)) # div除法 mod取余
print(divmod(9,5)) # 除余 得到元组 # print(round(3.14159,3))
# print(pow(2,3)) #pow幂运算 == 2**3
# print(pow(3,2))
# print(pow(2,3,3)) #幂运算之后再取余
# print(pow(3,2,1)) ret = sum([1,2,3,4,5,6])
print(ret) ret = sum([1,2,3,4,5,6,10],)
print(ret) # print(min([1,2,3,4]))
# print(min(1,2,3,4))
# print(min(1,2,3,-4))
# print(min(1,2,3,-4,key = abs)) # print(max([1,2,3,4]))
# print(max(1,2,3,4))
# print(max(1,2,3,-4))
print(max(1,2,3,-4,key = abs)) print(3>2==2) # True
继续补充:注意list作为函数的参数的问题
def extlist(val, lis=[]):
lis.append(val)
return lis list1 = extlist(10)
print(list1)
list2 = extlist(123,[])
print(list2)
list3 = extlist('a')
print(list3)
print(list1) # 这个结果将和list3一样,因为是可变数据类型。类似于 lis=[] 独立在函数之外 print(5 + 12j) # 实数 + 虚数 == 复数 # 取某个 range中的数时,一定要list下,才能取得到
slice , format , bytes , expr
lis = [1,2,3,4,5] l2 = reversed(lis) # 保留原有列表,返回一个反向的迭代器
print(l2)
print(lis) s = slice(0,5,2) # 切片
print(lis[s]) # 等同于下面的切片
print(lis[0:5:2]) print(format('***','<20')) # 左对齐
print(format('***','>20')) # 右对齐
print(format('***','^20')) # 居中对齐 print(format(3,'b')) # 转为二进制
print(format(95,'c')) # 转成 unicode字符
print(format(13,'x')) # 转成16进制 print(bytes('你好',encoding='gbk'))
print(bytes('你好',encoding='utf8')) # 编码
print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf8')) # 解码 a = 'abcd'
print('hello %r' %a) # %r 调用了 repr 方法
print(repr(a)) # 变量原样输出 %r
all , any , zip , filter , map , sorted
# all 有一个False,即为False , any 是有一个True,即为 True
print(all(['a', '', 123]))
print(all(['a', 123]))
print(all([0, 123])) print(any(['', True, 0, []])) # 拉链方法
l = [1, 2, 3, 4, 5]
l2 = ['a', 'b', 'c', 'd']
l3 = ('*', '**', [1, 2])
d = {'k1': 1, 'k2': 2} # for i in zip(l,l2):
# print(i) for i in zip(l, l2, l3, d):
print(i) # filter 重要的过滤方法
def is_odd(x):
return x % 2 == 1 # print(is_odd(9)) # True # 第一个参数只能是函数名,没有括号。第二个是可迭代对象
ret = filter(is_odd,[3,6,7,9,12,17])
# print(ret)
for i in ret:
print(i) # 例二 过滤字符串
def is_str(x):
return type(x) == str res = filter(is_str,[1,'alex',3,5,'abc',8])
for i in res:
print(i) # 例三 求100以内开方结果为整数的数
from math import sqrt
def func(n):
res = sqrt(n)
return res %1 ==0 rs = filter(func,range(1,101))
for i in rs:
print(i) # 例四: 去除列表中的空元素
def real_str(x):
return x and str(x).strip() res = filter(real_str,[1,'alex',0,' ',' ',None])
for i in res:
print(i) ret = map(abs,[1,-4,6,-8])
print(ret)
for i in ret:
print(i) # filter 执行了filter之后的结果集合 <= 执行之前的个数
#filter只管筛选,不会改变原来的值
# map 执行前后元素个数不变
# 值可能发生改变 l = [1,-4,6,5,-10]
# l.sort() # 在原列表的基础上进行排序
# print(l)
l.sort(key = abs) # 带上处理函数的排序
print(l) print(sorted(l,key=abs,reverse=True)) # 生成了一个新列表 不改变原列表 占内存
print(l) l = [' ',[1,2],'hello world']
new_l = sorted(l,key=len)
print(new_l)
python基础12_匿名_内置函数的更多相关文章
-
python基础之 装饰器,内置函数
1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使用外部变量(非全局变量)叫做闭包! def wrapper(): money =10 def inner(num) ...
-
【python基础语法】常用内置函数、关键字、方法和之间的区别(小结)
''' 关键字: False:bool数据类型 True:bool数据类型 None:表示数据的内容为空 and:逻辑运算符:与 or:逻辑运算符:或 not:逻辑运算符:非 in:身份运算符,判断变 ...
-
Python基础(七)内置函数
今天来介绍一下Python解释器包含的一系列的内置函数,下面表格按字母顺序列出了内置函数: 下面就一一介绍一下内置函数的用法: 1.abs() 返回一个数值的绝对值,可以是整数或浮点数等. 1 2 3 ...
-
Python基础(十一)--内置函数
内置函数 数学类 abs():绝对值 round():四舍五入 >>> round(1.3747,1) 1.4 sum():求和 >>> sum({1:'dj',2 ...
-
Python笔记(二十一)_内置函数、内置方法
内置函数 issubclass(class1,class2) 判断class1类是否为class2类的子类,返回True和False 注意1:类会被认为是自身的子类 >>>issub ...
-
【python基础】常用的内置函数
python基础之内置函数 参考: http://www.runoob.com/python/python-built-in-functions.html -zip() zip函数接受任意多个(包括0 ...
-
python基础学习1-类相关内置函数
#!/usr/bin/env python # -*- coding:utf-8 -*- #===issubclass(class,classinfo) 检查class是否是classinfo类的子类 ...
-
Python基础(六)-内置函数
map().filter().reduce() map(func,iterator) --> filter(func,iterator) --> reduce(func,iterato ...
-
python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)
面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...
随机推荐
-
WPF中的文字修饰
我们知道,文字的修饰包括:空心字.立体字.划线字.阴影字.加粗.倾斜等.这里只说划线字的修饰方式,按划线的位置,我们可将之分为:上划线.中划线.基线与下划线.如图: 从上至下,分别为上划线(Overl ...
-
easyui源码翻译1.32--Droppable(放置)
前言 使用$.fn.droppable.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3.2 * *翻译:lbq --放置 拉伸 */ (fun ...
-
Big Clock
Problem Description Our vicar raised money to have the church clock repaired for several weeks. The ...
-
java学习多线程之创建多线程一
现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程.那么如何创建多线程,我们知道在系统当中qq的多线程创建是由操作系统来完成的,那么如果我们想在java当 ...
-
Python学习笔记12:标准库之对象序列化(pickle包,cPickle包)
计算机的内存中存储的是二进制的序列. 我们能够直接将某个对象所相应位置的数据抓取下来,转换成文本流 (这个过程叫做serialize),然后将文本流存入到文件里. 因为Python在创建对象时,要參考 ...
-
boostrap---btn
bootstrap入门教程,按钮.按钮风格.下拉菜单等 本教程演示: bootstrap框架的按钮.按钮大小.按钮风格.按钮组.下拉菜单制作等. 使用的版本:Bootstrap v2.3.2 . 下面 ...
-
游历校园 [COGS 614] [欧拉图]
Description 刷完牙洗完脸,黄黄同学就要上课去了.可是黄黄同学每次去上课时总喜欢把校园里面的每条路都走一遍,当然,黄黄同学想每条路也只走一遍.我们一般人很可能对一些地图是办不到每条路走一遍且 ...
-
Java并发编程笔记之SimpleDateFormat源码分析
SimpleDateFormat 是 Java 提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个 SimpleDateFormat 实例对日期进行 ...
-
UITableView简述
原帖:http://blog.csdn.net/totogo2010/article/details/7642908 Table View简单描述: 在iPhone和其他iOS的很多程序中都会看到Ta ...
-
工具软件推荐——GifCam
博文里面的动态gif图片都是使用这款软件录制的,可以选择帧率,清晰度,并且编辑每一帧的图片,非常好用,特此推荐~ 注意: GifCam 是一款免费绿色的软件. 大家尽量在官方下载 下载地址. 最新的版 ...