Python ☞ day 4

Python学习笔记之 (set)集合 & 迭代器 & 函数 & 匿名函数 & 高阶函数

set

set:类似dict1,是一组key的集合,不存储value
本质:无序和无重复元素的集合

#创建
#创建set需要一个list或者tuple或者dict作为输入
#重复元素在set中会自动被过滤
set1 = set([1,2,3,4,5,5,4,3,3])
print(set1)

set2 = set((1,2,3,4,3,2))
print(set2)

set3 = set({1:"good",2:"nice"})
print(set3)
#添加
set4 = set([1,2,3,4,5])
set4.add(6)
set4.add(4) #可以添加重复的,但是不会有效果
#set4.add([7,8,9]) #set的元素不能是列表,因为列表是可变的
set4.add((7,8,9))
#set4.add({4:"good"}) #set的元素不能是字典,因为字典也是可变的
print(set4)
#插入整个list、tuple、字符串,打碎插入
set5 = set([1,2,3,4,5])
set5.update([6,7,8])
set5.update((9,10))
set5.update("sunck")
print(set5)
#删除
set6 = set([1,2,3,4,5])
set6.remove(3)
print(set6)
#遍历
set7 = set([1,2,3,4,5])
for i in set7:
    print(i)
#set没有索引
#print(set7[2])

for index,i in enumerate(set7):
    print(index,i)
set8 = set([1,2,3])
set9 = set([2,3,4])
#交集
a1 = set8 & set9
print(a1)
print(type(a1))
#并集
a2 = set8 | set9
print(a2)
print(type(a2))

类型转换

#list > set
l1 = [1,2,3,4,5,5,3,2,5,6,9]
print(set(l1))

#tuple > set
t1 = (1,2,3,4,4,5,2)
print(set(t1))

#set > list
s1 = {1,2,3,4}
print(list(s1))

#set > tuple
s2 = {1,2,3,4,5}
print(tuple(s2))
迭代器
  • 可迭代对象:可以直接作用于for循环的对象统称为迭代对象
    (Iterable)。可以用isinstance()去判断一个对象是否是Iterable对象

  • 可以直接作用于for的数据类型一般分为两种
    1、集合数据类型,如list、tuple、dict、set、string
    2、是generator,包括生成器和带yield的generator function

from collections import Iterable,Iterator
print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance({},Iterable))
print(isinstance("",Iterable))
print(isinstance((x for x in range(10)),Iterable))
  • 迭代器:不但可以作用于for循环,还可以被next()函数不断的调用并返回下一个值,直到最后抛出一个StopIteration错误,说明表示继续返回下一个值
  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器
    (Iterator对象)

  • 可以使用isinstance()函数判断一个对象是否是Iterator对象

print(isinstance([],Iterator))
print(isinstance((),Iterator))
print(isinstance({},Iterator))
print(isinstance("",Iterator))
print(isinstance((x for x in range(10)),Iterator))

l = (x for x in range(10))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
#转成Iterator对象
a = iter([1,2,3,4,5])
print(next(a))
print(next(a))
print(isinstance(iter([]),Iterator))
print(isinstance(iter(()),Iterator))
print(isinstance(iter({}),Iterator))
print(isinstance(iter(""),Iterator))
'''
endstr = "end"
str = ""
for line in iter(input,endstr):
    str += line + "\n"
print(str)
'''
函数
  • 认识函数:在一个完整的项目中,某些功能会反复使用。那么会将功能封装成函数,当我们要使用功能的时候直接调用函数即可。

  • 本质:函数就是对功能的封装

  • 优点:
    1、简化代码结构,增加了代码的复用度(重复使用的程度)
    2、如果想修改某些功能或者调试某个BUG,只需要修改对应的函数即可

'''
定义函数:
格式:
def 函数名(参数列表):
    语句
    return 表达式

def:函数代码块以def关键字开始
函数名:遵循标识符规则
():是参数列表的开始和结束
参数列表(参数1,参数2,……,参数n):任何传入函数的参数和变量必须放在圆括号之间,用逗号分隔。函数从函数的调用者那里获取的信息
冒号:函数内容(封装的功能)以冒号开始,并且缩进。
语句:函数封装的功能
return:一般用于结束函数,并返回信息给函数的调用者。
表达式:即为要返回给函数的调用者的信息,

注意:最后的return表达式,可以不写,相当于return None
'''
#   定义了一个无参无返回值的函数
def myPrint():
    print("lee is a very good man!")
    print("lee is a nice man!")
    print("lee is a handsome man!")
myPrint()
myPrint()
myPrint()
myPrint()
  • 函数的调用
    格式:函数名(参数列表)
    函数名:是要使用的功能的函数名字
    参数列表:函数的调用者给函数传递的信息,如果没有参数,小括号也不能省略

  • 函数调用的本质:实参给形参赋值的过程

函数的参数
#   需求:编写一个函数,给函数一个字符串和一个年龄,在函数内部打印出来

#   形参(形式参数):定义函数时小括号中的变量,本质是变量
#   参数必须按顺序传递,个数目前要对应
# def myPrint(str,age,hoby):
#     print(str,age)
def myPrint(str,age):
    print(str,age)

#   实参(实际参数):调用参数时给函数传递的数据,实参的本质是值
myPrint("lee is a good man!", a)
  • 返回值:
#   编写函数,实现功能,给函数两个数,返回这两个数的和
def mySum(num1,num2):
    #   将结果返回给函数的调用者
    return num1 + num2
    #   执行完return语句,该函数就结束了,return后面的代码不执行
    print("888888888")

res = mySum(1,2)
print(res)
  • 传递参数
    1、值传递:传递的不可变类型
    string、tuple、number是不可变的
    2、引用传递:传递的可变类型
    list、dict、set是可变的
def func1(num):
    num = 10

temp = 20
func1(temp)     #num = temp
print(temp)

def func2(lis):
    lis[0] = 100

list1 = [1,2,3,4,5]
func2(list1)
print(list1)
  • 关键字参数:允许函数调用时参数的顺序与定义时不一致
def myPrint(str,age):
    print(str,age)

#   使用关键字参数
myPrint(age = 18,str = "lee is a good man!")
  • 默认参数:调用函数时,如果没有传递参数,则使用默认参数
#   要用默认参数,最好将默认参数放在最后
def myPrint(str,age = 18):
    print(str,age)
myPrint("lee",10)
  • 不定长参数:能处理比定义时更多的参数
#   加了星号(*)的变量存放未命名的变量参数,如果在函数调用时没有指定参数,它就是一个空元组
def function(name, *args):
    print(name)
    print(type(args))
    for x in args:
        print(x)
function("lee","good","nice")

def function1(*args):
    sum = 0
    for i in args:
        sum += i
    return sum
print(function1(1,2,3,4,5,5,6,7,7,1))

#   **代表着键值对的参数字典,和*所代表的意义类似
def function2(**kwargs):
    print(kwargs)
    print(type(kwargs))
function2(x=1,y=2,z=3)


def function3(*args,**kwargs):
    pass    #代表一个空语句
匿名函数
  • 不使用def这样的语句定义函数,使用lambda来创建匿名函数
  • 特点:
    1、lambda只是一个表达式,函数体比def简单
    2、lambda的主体是一个表达式,而不是代码块,仅仅只能在lambda表达式中封装简单的逻辑
    3、lambda函数有自己的命名空间,且不能访问自由参数列表之外的或全局命名空间的参数
    4、虽然lambda是一个表达式且只看起来只能写一行,与C和C++内联函数不同。
  • 格式:lambda 参数1,参数2,……参数n:expression
sum = lambda num1,num2:num1 + num2
print(sum(1,2))
高阶函数
  • 高阶函数 - map
    map()
    原型 map(fn, lsd)
    参数1是列表
    参数2是序列
    功能:将传入的函数依次作用与序列中的每一个元素,并把结果作为新的Interator返回
'''
def myMap(func, li):
    resList = []
    for parase in li:
        res = func(parase)
        resList.append(res)
'''


#将单个字符转成对应的字面量整数
def chr2int(chr):
    return {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}[chr]

list1 = ["2","1","6","5"]
res = map(chr2int, list1)
#[chr2int("2"),chr2int("1"),chr2int("6"),chr2int("5")]
print(res)
# 打印结果:<map object at 0x000001CE1D0C9E10>
print(list(res))
# 打印结果:[2, 1, 6, 5]


#将整数元素的序列,转为字符串型
#[1,2,3,4]  -> ["1","2","3","4"]
l = map(str, [1,2,3,4])
print(list(l))
# 打印结果:['1', '2', '3', '4']
  • 高阶函数 - reduce
    reduce(fn, lsd)
    参数1是列表
    参数2是序列
    功能:一个函数作用在序列上,这个函数必须接受两个参数,reduce把结果继续和序列 的下一个元素累计运算
    reduce(f, [a, b, c, d])
#求一个序列的和
list2 = [1,2,3,4,5]
#1 + 2
#1 + 2  + 3
#1 + 2  + 3 +4
#1 + 2  + 3 +4 +5
def mySum(x,y):
    return x + y
r = reduce(mySum, list2)
print("r =", r)
# 打印结果:15


# 需求:将字符串转成对应字面量数字
def str2int(str):
    def fc(x, y):
        return x * 10 + y
    def fs(chr):
        return {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}[chr]
    return reduce(fc, map(fs, list(str)))

a = str2int("12534")
print(a)
print(type(a))

  • 高阶函数 - filter (过滤)
    原型:filter(fn, lsd)
    参数1为函数
    参数2为序列
    功能:用于过滤序列的
    白话文:把传入的函数依次作用与系列每个元素,根据返回的是True还是False决定是否保留该元素
list1 = [1,2,3,4,5,6,7,8,9]
#筛选条件
def func(num):
    #偶数保留
    if num%2 == 0:
        return True
    #奇数剔除
    return False
l = filter(func, list1)
print(list(l))
# 打印结果:[2, 4, 6, 8]

data= [["姓名","年龄","爱好"],["tom", 25, "无"],["hanmeimei", 26, "金钱"]]
def func2(v):
    v = str(v)
    if v == "无":
        return False
    return True
for line in data:
    m = filter(func2, line)
    print(list(m))
# 打印结果:
['姓名', '年龄', '爱好']
['tom', 25]
['hanmeimei', 26, '金钱']
  • 高阶函数 - sorted (排序)
    常见的排序有:冒泡, 选择 快速, 插入, 计数器
# sorted排序:
普通排序
list1 = [3,4,6,2,9]
list2 = sorted(list1)   #默认升序排序
print(list1)
#打印结果:[3, 4, 6, 2, 9]
print(list2)
#打印结果:[2, 3, 4, 6, 9]

#按绝对值大小排序
list3 = [3,4,-7,6,-10,2,9]
#key接受函数来实现自定义排序规则
list4 = sorted(list3, key=abs)
print(list3)
#打印结果:[3, 4, -7, 6, -10, 2, 9]
print(list4)
#打印结果:[2, 3, 4, 6, -7, 9, -10]

#降序
list5 = [3,4,6,2,9]
list6 = sorted(list5, reverse=True)
print(list5)
#打印结果:[3, 4, 6, 2, 9]
print(list6)
#打印结果:[9, 6, 4, 3, 2]

#函数可以自己写
def myLen(str):
    return len(str)
list7 = ['b333','a1111111','c22','d5554']
list8 = sorted(list7,key=myLen)#默认升序排序
print(list7)
#打印结果:['b333', 'a1111111', 'c22', 'd5554']
print(list8)
#打印结果:['c22', 'b333', 'd5554', 'a1111111']

Python 内置函数参考链接 官方文档
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容