zoukankan      html  css  js  c++  java
  • 函数式编程 偏函数 生成器 yield

    高阶函数

    # 高阶函数
    def f(x):
    return x * x



    # map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
    # map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。
    r_lazy = map(f, [1, 2, 3]) # 惰性序列
    r = list(r_lazy)

    from functools import reduce


    def add(x, y):
    return x + y


    r_reduce = reduce(add, [1, 4, 9])


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

    # 和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
    r_lazy_1 = filter(is_odd, [1, 2, 3, 4])
    r_1 = list(r_lazy_1)




    偏函数

    import functools

    int2 = functools.partial(int, base=2)


    def f(x, d=3):
    return x ** d


    f4 = functools.partial(f, d=4)
    f2 = functools.partial(f, d=2)



    L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]


    def by_name(t):
    return t[1]


    sorted(L, key=by_name)

    L = [3, -5, 6, -89]
    sorted(L, key=abs)

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

    sorted - 廖雪峰的官方网站 https://www.liaoxuefeng.com/wiki/1016959663602400/1017408670135712
    默认情况下,对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。






    """Filename globbing utility."""

    import os
    import re
    import fnmatch
    import sys

    __all__ = ["glob", "iglob", "escape"]

    def glob(pathname, *, recursive=False):
    """Return a list of paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    """
    return list(iglob(pathname, recursive=recursive))

    def iglob(pathname, *, recursive=False):
    """Return an iterator which yields the paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    """
    it = _iglob(pathname, recursive, False)
    if recursive and _isrecursive(pathname):
    s = next(it) # skip empty string
    assert not s
    return it

    def _iglob(pathname, recursive, dironly):
    sys.audit("glob.glob", pathname, recursive)
    dirname, basename = os.path.split(pathname)
    if not has_magic(pathname):
    assert not dironly
    if basename:
    if os.path.lexists(pathname):
    yield pathname
    else:
    # Patterns ending with a slash should match only directories
    if os.path.isdir(dirname):
    yield pathname
    return
    if not dirname:
    if recursive and _isrecursive(basename):
    yield from _glob2(dirname, basename, dironly)
    else:
    yield from _glob1(dirname, basename, dironly)
    return
    # `os.path.split()` returns the argument itself as a dirname if it is a
    # drive or UNC path. Prevent an infinite recursion if a drive or UNC path
    # contains magic characters (i.e. r'\?C:').
    if dirname != pathname and has_magic(dirname):
    dirs = _iglob(dirname, recursive, True)
    else:
    dirs = [dirname]
    if has_magic(basename):
    if recursive and _isrecursive(basename):
    glob_in_dir = _glob2
    else:
    glob_in_dir = _glob1
    else:
    glob_in_dir = _glob0
    for dirname in dirs:
    for name in glob_in_dir(dirname, basename, dironly):
    yield os.path.join(dirname, name)

    # These 2 helper functions non-recursively glob inside a literal directory.
    # They return a list of basenames. _glob1 accepts a pattern while _glob0
    # takes a literal basename (so it only has to check for its existence).

    def _glob1(dirname, pattern, dironly):
    names = list(_iterdir(dirname, dironly))
    if not _ishidden(pattern):
    names = (x for x in names if not _ishidden(x))
    return fnmatch.filter(names, pattern)

    def _glob0(dirname, basename, dironly):
    if not basename:
    # `os.path.split()` returns an empty basename for paths ending with a
    # directory separator. 'q*x/' should match only directories.
    if os.path.isdir(dirname):
    return [basename]
    else:
    if os.path.lexists(os.path.join(dirname, basename)):
    return [basename]
    return []

    # Following functions are not public but can be used by third-party code.

    def glob0(dirname, pattern):
    return _glob0(dirname, pattern, False)

    def glob1(dirname, pattern):
    return _glob1(dirname, pattern, False)

    # This helper function recursively yields relative pathnames inside a literal
    # directory.

    def _glob2(dirname, pattern, dironly):
    assert _isrecursive(pattern)
    yield pattern[:0]
    yield from _rlistdir(dirname, dironly)

    # If dironly is false, yields all file names inside a directory.
    # If dironly is true, yields only directory names.
    def _iterdir(dirname, dironly):
    if not dirname:
    if isinstance(dirname, bytes):
    dirname = bytes(os.curdir, 'ASCII')
    else:
    dirname = os.curdir
    try:
    with os.scandir(dirname) as it:
    for entry in it:
    try:
    if not dironly or entry.is_dir():
    yield entry.name
    except OSError:
    pass
    except OSError:
    return

    # Recursively yields relative pathnames inside a literal directory.
    def _rlistdir(dirname, dironly):
    names = list(_iterdir(dirname, dironly))
    for x in names:
    if not _ishidden(x):
    yield x
    path = os.path.join(dirname, x) if dirname else x
    for y in _rlistdir(path, dironly):
    yield os.path.join(x, y)


    magic_check = re.compile('([*?[])')
    magic_check_bytes = re.compile(b'([*?[])')

    def has_magic(s):
    if isinstance(s, bytes):
    match = magic_check_bytes.search(s)
    else:
    match = magic_check.search(s)
    return match is not None

    def _ishidden(path):
    return path[0] in ('.', b'.'[0])

    def _isrecursive(pattern):
    if isinstance(pattern, bytes):
    return pattern == b'**'
    else:
    return pattern == '**'

    def escape(pathname):
    """Escape all special characters.
    """
    # Escaping is done by wrapping any of "*?[" between square brackets.
    # Metacharacters do not work in the drive part and shouldn't be escaped.
    drive, pathname = os.path.splitdrive(pathname)
    if isinstance(pathname, bytes):
    pathname = magic_check_bytes.sub(br'[1]', pathname)
    else:
    pathname = magic_check.sub(r'[1]', pathname)
    return drive + pathname
    py381Libglob.py








    """Filename globbing utility."""

    import os
    import re
    import fnmatch
    import sys

    __all__ = ["glob", "iglob", "escape"]

    def glob(pathname, *, recursive=False):
    """Return a list of paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    """
    return list(iglob(pathname, recursive=recursive))

    def iglob(pathname, *, recursive=False):
    """Return an iterator which yields the paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    """
    it = _iglob(pathname, recursive, False)
    if recursive and _isrecursive(pathname):
    s = next(it) # skip empty string
    assert not s
    return it

    def _iglob(pathname, recursive, dironly):
    sys.audit("glob.glob", pathname, recursive)
    dirname, basename = os.path.split(pathname)
    if not has_magic(pathname):
    assert not dironly
    if basename:
    if os.path.lexists(pathname):
    yield pathname
    else:
    # Patterns ending with a slash should match only directories
    if os.path.isdir(dirname):
    yield pathname
    return
    if not dirname:
    if recursive and _isrecursive(basename):
    yield from _glob2(dirname, basename, dironly)
    else:
    yield from _glob1(dirname, basename, dironly)
    return
    # `os.path.split()` returns the argument itself as a dirname if it is a
    # drive or UNC path. Prevent an infinite recursion if a drive or UNC path
    # contains magic characters (i.e. r'\?C:').
    if dirname != pathname and has_magic(dirname):
    dirs = _iglob(dirname, recursive, True)
    else:
    dirs = [dirname]
    if has_magic(basename):
    if recursive and _isrecursive(basename):
    glob_in_dir = _glob2
    else:
    glob_in_dir = _glob1
    else:
    glob_in_dir = _glob0
    for dirname in dirs:
    for name in glob_in_dir(dirname, basename, dironly):
    yield os.path.join(dirname, name)

    # These 2 helper functions non-recursively glob inside a literal directory.
    # They return a list of basenames. _glob1 accepts a pattern while _glob0
    # takes a literal basename (so it only has to check for its existence).

    def _glob1(dirname, pattern, dironly):
    names = list(_iterdir(dirname, dironly))
    if not _ishidden(pattern):
    names = (x for x in names if not _ishidden(x))
    return fnmatch.filter(names, pattern)

    def _glob0(dirname, basename, dironly):
    if not basename:
    # `os.path.split()` returns an empty basename for paths ending with a
    # directory separator. 'q*x/' should match only directories.
    if os.path.isdir(dirname):
    return [basename]
    else:
    if os.path.lexists(os.path.join(dirname, basename)):
    return [basename]
    return []

    # Following functions are not public but can be used by third-party code.

    def glob0(dirname, pattern):
    return _glob0(dirname, pattern, False)

    def glob1(dirname, pattern):
    return _glob1(dirname, pattern, False)

    # This helper function recursively yields relative pathnames inside a literal
    # directory.

    def _glob2(dirname, pattern, dironly):
    assert _isrecursive(pattern)
    yield pattern[:0]
    yield from _rlistdir(dirname, dironly)

    # If dironly is false, yields all file names inside a directory.
    # If dironly is true, yields only directory names.
    def _iterdir(dirname, dironly):
    if not dirname:
    if isinstance(dirname, bytes):
    dirname = bytes(os.curdir, 'ASCII')
    else:
    dirname = os.curdir
    try:
    with os.scandir(dirname) as it:
    for entry in it:
    try:
    if not dironly or entry.is_dir():
    yield entry.name
    except OSError:
    pass
    except OSError:
    return

    # Recursively yields relative pathnames inside a literal directory.
    def _rlistdir(dirname, dironly):
    names = list(_iterdir(dirname, dironly))
    for x in names:
    if not _ishidden(x):
    yield x
    path = os.path.join(dirname, x) if dirname else x
    for y in _rlistdir(path, dironly):
    yield os.path.join(x, y)


    magic_check = re.compile('([*?[])')
    magic_check_bytes = re.compile(b'([*?[])')

    def has_magic(s):
    if isinstance(s, bytes):
    match = magic_check_bytes.search(s)
    else:
    match = magic_check.search(s)
    return match is not None

    def _ishidden(path):
    return path[0] in ('.', b'.'[0])

    def _isrecursive(pattern):
    if isinstance(pattern, bytes):
    return pattern == b'**'
    else:
    return pattern == '**'

    def escape(pathname):
    """Escape all special characters.
    """
    # Escaping is done by wrapping any of "*?[" between square brackets.
    # Metacharacters do not work in the drive part and shouldn't be escaped.
    drive, pathname = os.path.splitdrive(pathname)
    if isinstance(pathname, bytes):
    pathname = magic_check_bytes.sub(br'[1]', pathname)
    else:
    pathname = magic_check.sub(r'[1]', pathname)
    return drive + pathname
  • 相关阅读:
    iOS 9之后Url链接的NSUTF8StringEncoding转码实现
    iOS实现应用更新及强制更新
    Objective-C代码简写
    Mac下使用数据库将Excel数据转换存入.plist
    iOS开发之图片压缩实现
    iOS键盘事件实现、控制
    iOS 轻击、触摸和手势的检测
    使用CocoaPods时遇到 Permission denied 问题
    2016-3-1 Mac下使用Hexo搭建Blog
    2016-3-1 安装Hexo过程中遇到的问题
  • 原文地址:https://www.cnblogs.com/rsapaper/p/6835058.html
Copyright © 2011-2022 走看看