美文网首页
不熟悉的函数

不熟悉的函数

作者: 三天逃离 | 来源:发表于2019-04-12 22:29 被阅读0次

1.内建的isinstance函数可以判断一个变量是不是字符串:

>>> x = 'abc'
>>> y = 123
>>> isinstance(x, str)
True
>>> isinstance(y, str)
False

题目:

请修改列表生成式,通过添加if语句保证列表生成式能正确地执行:

# -*- coding: utf-8 -*-
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [i.lower() for i in L1 if isinstance(i, str)]

输出结果:

['hello', 'world', 'apple'] 

2.Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

>>>for i, value in enumerate(['A','B','C']):
       print(i, value)

输出为:

0, A
1, B
2, C

3.map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

>>> def f(x):
...     return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

4.reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

比方说对一个序列求和,就可以用reduce实现:

>>> from functools import reduce
>>> def add(x, y):
...     return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

题目:
①利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']:

def normalize(name):
    name = name[0].upper() + name[1:].lower()
    return name

②Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积:

from functools import reduce
def prod(L):
    return reduce(lambda x, y : x * y, L)

③利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456:

from functools import reduce
def str2float(s):
    def fn(x,y)
        return x * 10 + y
    n = s.index('.')
    s1 = list(map(int, [i for i in s[:n]]))
    s2 = list(map(int, [i for i in s[n+1:]]))
    return reduce(fn,s1) + reduce(fn,s2) / 10 ** len(s2)

5.Python内建的filter()函数用于过滤序列。
和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
例如,在一个list中,删掉偶数,只保留奇数,可以这么写:

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

可见用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。

注意到filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。
练习
回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数:

# 解法1
def is_palindrome(n):
    n = str(n)
    return n == n[::-1]
print list(filter(is_palindrome,range(1,1000)))

# 解法2
print list(filter(lambda n : str(n)==str(n)[::-1],range(1,1000)))

# 解法3
def is_palindrome(n):
    n = str(n)
    h = list(range((len(s))//2))
        for i in h:
            if s[i] != s[-(i+1)]:
            return False
    return True

6.Python内置的sorted()函数就可以对list进行排序:

>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]

sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能用一个key函数把字符串映射为忽略大小写排序即可。忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较。

这样,我们给sorted传入key函数,即可实现忽略大小写的排序:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']

要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

练习
假设我们用一组tuple表示学生名字和成绩:

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
请用sorted()对上述列表分别按名字排序:

# -*- coding: utf-8 -*-

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
    return t[0]
L2 = sorted(L, key=by_name)
print(L2)
# 结果为:
[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)] 
再按成绩从高到低排序:

# -*- coding: utf-8 -*-

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_score(t):
    return t[1]

L2 = sorted(L, key=by_score)
print(L2)
# 结果为:
[('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)] 

7.当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
匿名函数lambda x: x * x,关键字lambda表示匿名函数,冒号前面的x表示函数参数。匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
练习
请用匿名函数改造下面的代码:

# -*- coding: utf-8 -*-
# def is_odd(n):
#     return n % 2 == 1

# L = list(filter(is_odd, range(1, 20)))

L = list(filter(lambda x: x % 2 == 1, range(1,20)))

相关文章

  • 不熟悉的函数

    1.内建的isinstance函数可以判断一个变量是不是字符串: 题目: 请修改列表生成式,通过添加if语句保证列...

  • [2] Long Method (过长函数)

    2 Long Method (过长函数) 拥有短函数的对象会活的比较好,比较长. 不熟悉面向对象的人,常常觉得对象...

  • MySQL 中 常用函数(1)

    本篇整理一下 MySQL 中比较常用的函数,在日常工作中遇到其他不熟悉的函数完全可以查手册,记住各种不常用函数的意...

  • NDK开发---C++学习(六):继承、多态

    前言 前面我们已经介绍过了C++中的类与函数,不熟悉的,可以去看看NDK开发---C++学习(三):类与函数(上)...

  • 通俗理解:概率分布函数、概率密度函数

    这篇文章通俗地解释了概率论的两个基石函数:概率分布函数、概率密度函数,建议不熟悉的同学,认真阅读。 1先从离散型随...

  • 九九乘法表

    大家好,今天我给大家介绍九九乘法表的十种方法。前五种是普通函数做法,后面五五种是数组函数做法。对函数不熟悉的小伙伴...

  • 2018-11-25 WEEKDAY 用途——5队cooc梅香

    大家好,我是5队的Coco-梅香,我认领的函数Weekday。我对这个函数不熟悉,基于认领的责任,我百度了它的具体...

  • Python函数和代码复用笔记

    小白笔记仅记录常规操作中较为不熟悉的操作类型 一、函数递归1、必须有边界条件:即基例,它是函数递归的终止条件汉诺塔...

  • 涉及C++ STL容器的强制类型转换

    用C++做leetcode的时候偶有出现函数返回类型需要从deque转到vector的情况,之前不熟悉相关语法,故...

  • 导数运算不放心你可以坚持练习这个

    求下列函数的导数 以上函数均摘自高中数学课本选修2-2下周将作为课堂检测内容考察,请对导数运算仍然不熟悉的同学自己...

网友评论

      本文标题:不熟悉的函数

      本文链接:https://www.haomeiwen.com/subject/hhoxwqtx.html