`

Python技巧----函数作为参数以及dict代替if

 
阅读更多

这是tkinter的代码,command参数表示按钮对应的动作,这个参数是个函数

# 操作符按钮
self.btn_add = tk.Button(self.tkwindow, text='+', command=self.command_add)
self.btn_add.pack(padx=1, side='left')

self.btn_minus = tk.Button(self.tkwindow, text='-', command=self.command_minus)
self.btn_minus.pack(padx=1, side='left')
        
self.btn_multiply = tk.Button(self.tkwindow, text='*', command=self.command_multipy)
self.btn_multiply.pack(padx=1, side='left')

self.btn_divide = tk.Button(self.tkwindow, text='/', command=self.command_divide)
self.btn_divide.pack(padx=1, side='left')

'''
省略
'''

    def command_add(self):
        if self.op_can_use:
            self.op_now = '+'
            self.op_pressed = True

    def command_minus(self):
        if self.op_can_use:
            self.op_now = '-'
            self.op_pressed = True

    def command_multipy(self):
        if self.op_can_use:
            self.op_now = '*'
            self.op_pressed = True

    def command_divide(self):
        if self.op_can_use:
            self.op_now = '/'
            self.op_pressed = True

 

但这4个command的函数几乎长得一模一样啊,有四个还好,如果有十几个怎么办,能不能精简点

    def command_op(self, op):
        if self.op_can_use:
            self.op_now = op
            self.op_pressed = True

    def command_add(self):
        return self.command_op('+')
    def command_minus(self):
        return self.command_op('-')
    def command_multipy(self):
        return self.command_op('*')
    def command_divide(self):
        return self.command_op('/')    

 

 

和dict配合使用

self.opdict = {'+': add, '-': minus, '*': multiply, '/': divide}


#这是调用,根据op_now选择对应的函数,代替if判断
self.opnum = self.opdict[self.op_now](self.opnum, self.num_temp)[0]

 

 

 

全部代码,计算24点,用tkinter做了界面,两个文件一个界面,一个计算24点的函数

# enconding:utf-8
# file point24/gui

import tkinter as tk
import random
from point24.bk import cal_24point, add, minus, multiply, divide

class Window:
    def __init__(self, title='24点', width=650, height=400):

        self.w = width
        self.h = height
        self.tkwindow = tk.Tk(className=title)
        self.opdict = {'+': add, '-': minus, '*': multiply, '/': divide}
        self.init_status()
        self.add_compnent()

    def init_status(self):


        self.op_pressed = False
        self.op_now = ''
        self.opnum = 0
        self.num_temp = 0
        self.num_count = 0
        self.op_can_use = False
        self.btn_num_temp_used = False

    def fournumber(self):
        TEN_OR_K = 10
        self.num1 = random.randint(1, TEN_OR_K)
        self.num2 = random.randint(1, TEN_OR_K)
        self.num3 = random.randint(1, TEN_OR_K)
        self.num4 = random.randint(1, TEN_OR_K)

    def add_compnent(self):
        B_WIDTH = 6
        B_HEIGHT = 5

        self.label_ans = tk.Label(text="answer", fg="black", bg="white")
        self.label_ans.pack()

        # 数字按钮
        self.fournumber()
        self.btn_num1 = tk.Button(self.tkwindow, text=self.num1, 
                                  command=self.command_num1,
                                  width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_num1.pack(side='left')

        self.btn_num2 = tk.Button(self.tkwindow, text=self.num2,
                                  command=self.command_num2,
                                  width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_num2.pack(side='left')

        self.btn_num3 = tk.Button(self.tkwindow, text=self.num3,
                                  command=self.command_num3,
                                  width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_num3.pack(side='left')
        
        self.btn_num4 = tk.Button(self.tkwindow, text=self.num4, 
                                  command=self.command_num4,
                                  width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_num4.pack(side='left')

        self.btn_num_temp = tk.Button(self.tkwindow, text=self.num_temp, 
                                      command=self.command_num_temp,
                                  width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_num_temp.pack(side='bottom')

        # 操作符按钮
        self.btn_add = tk.Button(self.tkwindow, text='+', 
                                 command=self.command_add,
                                 width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_add.pack(padx=1, side='left')

        self.btn_minus = tk.Button(self.tkwindow, text='-', 
                                   command=self.command_minus,
                                   width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_minus.pack(padx=1, side='left')
        
        self.btn_multiply = tk.Button(self.tkwindow, text='*', 
                                      command=self.command_multipy,
                                      width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_multiply.pack(padx=1, side='left')

        self.btn_divide = tk.Button(self.tkwindow, text='/', 
                                    command=self.command_divide,
                                    width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_divide.pack(padx=1, side='left')

        # 功能按钮
        self.btn_change = tk.Button(self.tkwindow, text='换一组', 
                                    command=self.command_change,
                                    width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_change.pack(padx=1, side='right')

        self.btn_answer = tk.Button(self.tkwindow, text='显示答案', 
                                    command=self.command_answer,
                                 width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_answer.pack(padx=1, side='right')

        self.btn_clear = tk.Button(self.tkwindow, text='清除', 
                                   command=self.command_clear,
                                 width=B_WIDTH, height=B_HEIGHT,relief='groove')
        self.btn_clear.pack(padx=1, side='right')

    # 一个数字只能按一次,按错了用clear重来
    def command_clear(self):
        self.btn_num1['state'] = 'active'
        self.btn_num2['state'] = 'active'
        self.btn_num3['state'] = 'active'
        self.btn_num4['state'] = 'active'
        self.btn_num_temp['state'] = 'active'
        self.btn_num_temp['text'] = '0'
        self.label_ans['text'] = 'answer'
        self.init_status()

    def command_answer(self):
        ans = cal_24point(self.num1, self.num2, self.num3, self.num4)
        self.label_ans['text'] = str(ans)

    def command_change(self):
        self.fournumber()
        self.btn_num1['text'] = self.num1
        self.btn_num2['text'] = self.num2
        self.btn_num3['text'] = self.num3
        self.btn_num4['text'] = self.num4
        self.command_clear()

    def command_op(self, op):
        if self.op_can_use:
            self.op_now = op
            self.op_pressed = True

    def command_add(self):
        return self.command_op('+')

    def command_minus(self):
        return self.command_op('-')

    def command_multipy(self):
        return self.command_op('*')

    def command_divide(self):
        return self.command_op('/')    

    def command_num_temp(self):
        if self.op_pressed:
            self.opnum = self.opdict[self.op_now](self.opnum, self.num_temp)[0]
            self.btn_num_temp['text'] = self.opnum
            self.num_temp = self.opnum
        else:
            self.opnum = self.num_temp
        print(self.opnum)
        self.op_pressed = False
        self.btn_num_temp['state'] = 'disabled'

        if self.opnum == 24:
            self.label_ans['text'] = 'right'

    def command_numwhich(self, num, btn_num):
        if self.op_pressed:
            self.opnum = self.opdict[self.op_now](self.opnum, num)[0]
            if not self.btn_num_temp_used:
                self.btn_num_temp['text'] = self.opnum
                self.num_temp = self.opnum
                self.btn_num_temp_used = True
        else:
            self.opnum = num
        print(self.opnum)
        self.op_pressed = False
        btn_num['state'] = 'disabled'
        self.op_can_use = True
        self.num_count += 1
        if self.opnum == 24 and self.num_count ==4:
            self.label_ans['text'] = 'right' 

    def command_num1(self):
        return self.command_numwhich(self.num1, self.btn_num1)

    def command_num2(self):
        return self.command_numwhich(self.num2, self.btn_num2)

    def command_num3(self):
        return self.command_numwhich(self.num3, self.btn_num3)

    def command_num4(self):
        return self.command_numwhich(self.num4, self.btn_num4)

    def center(self):
        ws = self.tkwindow.winfo_screenwidth()
        hs = self.tkwindow.winfo_screenheight()
        x = int((ws/2)-(self.w/2))
        y = int((hs/2)-(self.h/2))
        self.tkwindow.geometry('{}x{}+{}+{}'.format(self.w, self.h, x, y))

    def loop(self):
        self.tkwindow.resizable(False, False)
        self.center()
        self.tkwindow.mainloop()

# ##############################run##################################
w = Window()
w.loop()

 

 

 

# encoding:utf-8
# file point24/bk

import itertools
import random

def add(a, b):
    return a+b, str(a)+'+'+str(b)+'='+str(a+b)

def minus(a, b):
    # 打印答案时不要有负数
    if a<b:
        return 9999, 'no'
    return a-b, str(a)+'-'+str(b)+'='+str(a-b)

def multiply(a, b):
    return a*b, str(a)+'*'+str(b)+'='+str(a*b)

def divide(a, b):
    if b == 0:
        return 9999, 'no'
    return a/b, str(a)+'/'+str(b)+'='+str(a/b)


def cal_24point(a, b, c, d):
    # a, b, c, d的排列组合
    permutation_list = list(itertools.permutations([a, b, c, d], 4))  
    # 加减乘除 排列组合
    op_list = list(itertools.permutations([add, minus, multiply, divide], 4))  
    
    # pro1 到 pro5包装函数
    # ((a, b), c), d
    def pro1(op1, op2, op3):
        m = op1(pmt[0], pmt[1])
        n = op2(m[0], pmt[2])
        result = op3(n[0], pmt[3])
        if result[0] == 24:
            #print(m[1], n[1], result[1])
            return (m[1], n[1], result[1])
    
    # (c, (a, b)), d    
    def pro2(op1, op2, op3):
        m = op1(pmt[0], pmt[1])
        n = op2(pmt[2] , m[0])
        result = op3(n[0], pmt[3])
        if result[0] == 24:
            #print(m[1], n[1], result[1])
            return (m[1], n[1], result[1])

    # d, ((a, b), c)
    def pro3(op1, op2, op3):
        m = op1(pmt[0], pmt[1])
        n = op2(m[0], pmt[2])
        result = op3(pmt[3], n[0])
        if result[0] == 24:
            #print(m[1], n[1], result[1])
            return (m[1], n[1], result[1])

    # d, (c, (a, b))
    def pro4(op1, op2, op3):
        m = op1(pmt[0], pmt[1])
        n = op2(pmt[2], m[0])
        result = op3(pmt[3], n[0])
        if result[0] == 24:
            #print(m[1], n[1], result[1])
            return (m[1], n[1], result[1]) 

    # (a b)(c d)
    def pro5(op1, op2, op3):
        m = op1(pmt[0], pmt[1])
        n = op2(pmt[2], pmt[3])
        result = op3(n[0], m[0])
        if result[0] == 24:
            #print(m[1], n[1], result[1])
            return (m[1], n[1], result[1])

    for pmt in permutation_list:
        for op in op_list:
            # 相同运算符
            if pro1(op[0], op[0], op[0]):
                return pro1(op[0], op[0], op[0])
            if pro2(op[0], op[0], op[0]):
                return pro2(op[0], op[0], op[0])
            if pro3(op[0], op[0], op[0]):
                return pro3(op[0], op[0], op[0])
            if pro4(op[0], op[0], op[0]):
                return pro4(op[0], op[0], op[0])
            if pro5(op[0], op[0], op[0]):
                return pro5(op[0], op[0], op[0])

            # ((a, b), c), d
            if pro1(op[0], op[1], op[2]):
                return pro1(op[0], op[1], op[2])
            if pro1(op[0], op[1], op[1]):
                return pro1(op[0], op[1], op[1])
            if pro1(op[0], op[0], op[1]):
                return pro1(op[0], op[0], op[1])
            if pro1(op[0], op[1], op[0]):
                return pro1(op[0], op[1], op[0])

            # (c, (a, b)), d
            if pro2(op[0], op[1], op[2]):
                return pro2(op[0], op[1], op[2])
            if pro2(op[0], op[1], op[1]):
                return pro2(op[0], op[1], op[1])
            if pro2(op[0], op[0], op[1]):
                return pro2(op[0], op[0], op[1])
            if pro2(op[0], op[1], op[0]):
                return pro2(op[0], op[1], op[0])

            # d, ((a, b), c)
            if pro3(op[0], op[1], op[2]):
                return pro3(op[0], op[1], op[2])
            if pro3(op[0], op[1], op[1]):
                return pro3(op[0], op[1], op[1])
            if pro3(op[0], op[0], op[1]):
                return pro3(op[0], op[0], op[1])
            if pro3(op[0], op[1], op[0]):
                return pro3(op[0], op[1], op[0])

            # d, (c, (a, b))
            if pro4(op[0], op[1], op[2]):
                return pro4(op[0], op[1], op[2])
            if pro4(op[0], op[1], op[1]):
                return pro4(op[0], op[1], op[1])
            if pro4(op[0], op[0], op[1]):
                return pro4(op[0], op[0], op[1])
            if pro4(op[0], op[1], op[0]):
                return pro4(op[0], op[1], op[0])

            # (a b)(c d)
            if pro5(op[0], op[1], op[2]):
                return pro5(op[0], op[1], op[2])
            if pro5(op[0], op[1], op[1]):
                return pro5(op[0], op[1], op[1])
            if pro5(op[0], op[0], op[1]):
                return pro5(op[0], op[0], op[1])
            if pro5(op[0], op[1], op[0]):
                return pro5(op[0], op[1], op[0])
    print('no result')
    return None


# ---------------------------test---------------------------------
'''

for n in range(30):
    a = random.randint(1,13)
    b = random.randint(1,13)
    c = random.randint(1,13)
    d = random.randint(1,13)
    print(a, b, c, d)
    print(cal_24point(a, b, c, d),'*'*10)
'''

 

 界面是难看了点 ,哈哈哈哈



 

  • 大小: 12.4 KB
分享到:
评论

相关推荐

    Learning Python Book - Source Code

    4. **函数**:Python中的函数定义使用`def`关键字,支持默认参数、可变参数以及关键字参数。另外,还有内置函数如`len()`、`type()`等。 5. **模块和包**:Python通过模块(module)组织代码,使用`import`语句导入...

    python入门python-geodesy.rar

    4. **函数**:Python中的函数定义使用`def`关键字,可以有参数和返回值。函数可以提高代码的可重用性和模块化。 5. **模块与包**:Python有庞大的标准库和第三方库,如Numpy用于数值计算,Pandas用于数据处理,...

    Python-junior-master.zip

    1. **语法结构**:Python的语法简洁且易于理解,如缩进代替大括号表示代码块,使用`print()`函数进行输出,以及变量声明的灵活性等。初学者需要掌握如何编写有效的Python语句,包括赋值、条件判断、循环结构以及函数...

    python-2.7.15编程软件.rar

    1. **语法基础**:Python 以其简洁明了的语法闻名,如缩进代替大括号表示代码块,使用 `for` 和 `while` 循环,以及 `if-else` 语句等。在Python 2.7.15中,函数定义使用 `def` 关键字,类定义使用 `class`。 2. **...

    Python初学教程-简明Python教程.zip

    在Python中,函数是一等公民,可以作为参数传递,也可以作为返回值。函数定义使用def关键字,如`def my_function(param1, param2):`。Python还支持匿名函数,即lambda函数,适用于简单的一行计算。 控制流程是编程...

    python-basic

    5. **控制结构**:Python的控制结构包括条件语句(if-else, if-elif-else)、循环(for, while)和异常处理(try-except)。这些结构用于控制程序流程,实现条件判断和重复执行。 6. **函数与模块**:Python中的...

    python-速成指南.docx

    * Python 中使用 `elif` 语句来代替 `else if` 语句。 * 使用 `dir()` 函数可以获取对象支持的方法,例如 `dir(lst)`。 * 使用 `del` 语句可以删除 dict 中的某个 key,例如 `del dct['name']`。 本资源提供了 ...

    Python课程设计-学生信息管理系统.rar

    在学生信息管理系统中,会用到变量声明、条件语句(if-elif-else)、循环(for和while)、函数定义(def)以及异常处理(try-except)等。 2. **数据结构**:Python提供了丰富的内置数据结构,如列表(list)、元组...

    python第3天,python-Day03.rar

    2. **控制结构**:包括条件语句(if-elif-else)和循环语句(for和while)。例如,你可以用这些结构来执行特定的代码块,当满足特定条件时,或者重复执行一段代码直到满足某个条件。 3. **函数**:Python中的函数是...

    python cookbook 英文版

    《Python Cookbook》是一本深入解析Python编程语言的权威指南,其英文版提供了丰富的代码示例和实践技巧,帮助读者更深刻地理解Python的核心概念和高级功能。本书通过一系列实用的编程“食谱”(recipes),涵盖了从...

    Python项目整理: 基础入门、数据分析、爬虫实践-Python-Projects.zip

    4. **函数**:Python中的函数定义简单,支持默认参数、可变参数和关键字参数。 5. **模块**:通过import语句导入其他Python文件,实现代码复用。 其次,我们转向数据分析。Python在数据分析领域有强大的库支持,如...

    python核心编程阶段-python基础(代码+课件).zip

    了解如何正确地编写语句,如赋值语句、条件语句(if-else)、循环语句(for、while)以及函数定义等,是学习Python的第一步。 2. **数据类型**:Python支持多种数据类型,包括基本的整型(int)、浮点型(float)、...

    廖雪峰python教程【完整版】.pdf

    - **4.1 高阶函数**:高阶函数是指可以接受函数作为参数或返回函数作为结果的函数。这种函数式编程风格可以极大地提高代码的灵活性。 - **4.1.1 map/reduce**:`map()`函数将传入的函数依次作用到序列的每个元素,...

    Python-Review-MB

    3. **控制流**:Python支持条件语句(if-else)和循环结构(for、while),以及异常处理(try-except)。 4. **函数**:Python中的函数定义使用def关键字,支持默认参数、可变参数和关键字参数。此外,还有内置函数...

    python中的simplejson模块

    Python中的`simplejson`模块是Python标准库`json`的一个补充,主要在Python 2.6及更早版本中使用,因为那时Python的标准库还没有完全支持JSON。`simplejson`库提供了一个高效的JSON编码和解码接口,符合ECMAScript ...

    值得收藏,Python 开发中的高级技巧

    下面是一些Python开发中的高级技巧,包括但不限于列表推导式、字典推导式、集合推导式、合并字典、复制列表、反转列表、变量交换、高级拆包、函数返回多个值、列表合并成字符串、链式比较、`yield from`、使用字典...

    13 个你可能未使用过的 Python 技巧!.docx

    12. **条件表达式**:Python的三元运算符(条件表达式)允许你简洁地写一行代码实现if-else逻辑,如`value = x if condition else y`。 13. **with语句**:`with`语句用于管理资源,如文件、网络连接等,确保在使用...

    python-practise-and-learn:简单的python程序来练习和学习python

    3. **控制结构**:Python中的控制结构包括条件语句(if-else)和循环(for、while)。这些结构用于根据特定条件执行代码或重复执行某段代码,是编写逻辑的重要工具。 4. **函数**:函数是Python中的可重用代码块,...

    python3中文文档

    4. **函数和模块**:Python3的函数可以接受默认参数、关键字参数、可变参数,以及*args和**kwargs,这些设计使得函数的调用更加灵活。Python3的模块系统允许将代码组织成多个文件,通过import语句实现代码的重用和...

    core python

    3. **控制结构**: 控制结构是指导程序流程的重要部分,包括条件语句(if-elif-else)、循环(for、while)、以及异常处理(try-except-finally)。第五章的作业可能涉及编写基于特定条件执行不同代码段的程序,或者...

Global site tag (gtag.js) - Google Analytics