小编Ade*_*mro的帖子

在Python中,部分函数应用(currying)与显式函数定义

在Python中,它被认为是更好的风格:

  • 根据更一般的,可能是内部使用的函数明确定义有用的函数; 要么,
  • 使用部分函数应用程序来明确描述函数currying?

我将通过一个人为的例子来解释我的问题.

假设有人编写一个函数_sort_by_scoring,它接受两个参数:评分函数和项列表.它返回原始列表的副本,该副本按照每个项目在原始列表中的位置的分数排序.还提供了两个示例评分函数.

def _sort_by_score(scoring, items_list):
    unsorted_scored_list = [(scoring(len(items_list), item_position), item) for item_position, item in enumerate(items_list)]
    sorted_list = [item for score, item in sorted(unsorted_scored_list)]
    return sorted_list

def _identity_scoring(items_list_size, item_position):
    return item_position

def _reversed_scoring(items_list_size, item_position):
    return items_list_size - item_position
Run Code Online (Sandbox Code Playgroud)

函数_sort_by_score永远不会直接调用; 相反,它由其他单参数函数调用,它将评分函数及其唯一参数(项目列表)传递给_sort_by_scoring并返回结果.

# Explicit function definition style
def identity_ordering(items_list):
    return _sort_by_score(_identity_scoring, items_list)

def reversed_ordering(items_list):
    return _sort_by_score(_reversed_scoring, items_list)
Run Code Online (Sandbox Code Playgroud)

显然,这个意图在函数currying方面表达得更好.

# Curried function definition style
import functools
identity_ordering = functools.partial(_sort_by_score, _identity_scoring)
reversed_ordering = functools.partial(_sort_by_score, _reversed_scoring)
Run Code Online (Sandbox Code Playgroud)

用法(在任何一种情况下):

>>> foo = [1, 2, …
Run Code Online (Sandbox Code Playgroud)

python functional-programming currying partial-application

16
推荐指数
1
解决办法
7403
查看次数

R6RS与R5RS计划

我对计划相对较新,并且很难在线查找具体文档,概述R6RS发生的重大变化.有人在意吗?

scheme r6rs r5rs

13
推荐指数
1
解决办法
3845
查看次数

更好的算法来改变shuffle(或交错)多个不同长度的列表

我喜欢在旅途中观看我最喜欢的电视节目.我有我在播放列表中关注的每个节目的所有剧集.并非所有节目都包含相同数量的剧集.与喜欢马拉松的人不同,我喜欢将一个节目的剧集与另一个节目的剧集交错.

例如,如果我有一个名为ABC的节目有2集,而一个名为XYZ的节目有4集,我希望我的播放列表看起来像:

XYZe1.mp4
ABCe1.mp4
XYZe2.mp4
XYZe3.mp4
ABCe2.mp4
XYZe4.mp4
Run Code Online (Sandbox Code Playgroud)

生成此交错播放列表的一种方法是将每个节目表示为剧集列表,并在所有节目上执行轻快的随机播放.人们可以编写一个函数来计算每一集在单位时间间隔内的位置(0.0到1.0独占,0.0是赛季开始,1.0是赛季结束),然后根据他们的位置对所有剧集进行排序.

我在Python 2.7中编写了以下简单函数来执行in-shuffle:

def riffle_shuffle(piles_list):
    scored_pile = ((((item_position + 0.5) / len(pile), len(piles_list) - pile_position), item) for pile_position, pile in enumerate(piles_list) for item_position, item in enumerate(pile))
    shuffled_pile = [item for score, item in sorted(scored_pile)]
    return shuffled_pile
Run Code Online (Sandbox Code Playgroud)

要获取上述示例的播放列表,我只需要调用:

riffle_shuffle([['ABCe1.mp4', 'ABCe2.mp4'], ['XYZe1.mp4', 'XYZe2.mp4', 'XYZe3.mp4', 'XYZe4.mp4']])
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下都能很好地工作.但是,有些情况下结果不是最佳的 - 播放列表中的两个相邻条目是来自同一节目的剧集.例如:

>>> riffle_shuffle([['ABCe1', 'ABCe2'], ['LMNe1', 'LMNe2', 'LMNe3'], ['XYZe1', 'XYZe2', 'XYZe3', 'XYZe4', 'XYZe5']])
['XYZe1', 'LMNe1', 'ABCe1', 'XYZe2', 'XYZe3', 'LMNe2', 'XYZe4', 'ABCe2', 'LMNe3', 'XYZe5']
Run Code Online (Sandbox Code Playgroud)

请注意,有两个并排出现的'XYZ'剧集.这种情况可以简单地修复(手动交换'ABCe1'和'XYZe2').

我很想知道是否有更好的方法在不同长度的多个列表上交错或执行riffle shuffle.我想知道您是否拥有更简单,更高效或简单优雅的解决方案.


belisarius提出的解决方案(谢谢!):

import …
Run Code Online (Sandbox Code Playgroud)

python language-agnostic algorithm shuffle

8
推荐指数
1
解决办法
1987
查看次数

使用未分配的局部变量?

Visual Studio中口口声声说Use of unassigned variableiValiNumber.谁能告诉我哪里出错了?

这是一个代码,要求用户继续输入整数并将其添加到用户想要停止.然后在控制台上显示整数之和.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AddFive
{
    class Program
    {
        static void Main(string[] args)
        {
           int iNumber;
           int iVal;
           int iTotal = 0;

            while (iVal > 0)
            {
                Console.WriteLine("Enter number " + iNumber);
                iVal = Convert.ToInt32(Console.ReadLine());
                iTotal = iTotal + iVal;
            }

            if (iNumber <= 0)
            {
                Console.WriteLine("Total = " + iTotal);
                iVal = Convert.ToInt32(Console.ReadLine());
                iTotal = iTotal + iVal;
            }

            Console.WriteLine("Total = " …
Run Code Online (Sandbox Code Playgroud)

c#

4
推荐指数
2
解决办法
3061
查看次数