(python)代码学习||2024.2.3||题目是codewars上的【Validate Sudoku with size `NxN`】
题目的要求是写一个Sudoku类,类中要有一个实例函数判断传给对象的二维数组是否符合数独规则
题目链接:https://www.codewars.com/kata/540afbe2dc9f615d5e000425/python
下面是写完题后看到的别人的解决方法
from itertools import chain
class Sudoku(object):
def __init__(self, grid):
self.grid = grid
self.size = len(grid)
self.good_zone = set(range(1, self.size + 1))
def __iter__(self):
"""Iterate over each row, column and square of the sudoku"""
rows = self.grid
cols = zip(*rows)
square_size = int(self.size ** 0.5)
squares = [sum((rows[y+i][x:x+square_size]
for i in range(square_size)), [])
for y in range(0, self.size, square_size)
for x in range(0, self.size, square_size)]
return chain(rows, cols, squares)
def valid_data_types(self):
"""Check data types"""
return all(type(num) == int for num in chain(*self.grid))
def zone_is_valid(self, zone):
"""Check if a zone contain every numbers"""
return set(zone) == self.good_zone
def is_valid(self):
"""Is the sudoku solved"""
if not self.valid_data_types(): return False
return all(self.zone_is_valid(zone) for zone in self)
观察到的东西
- 函数
__iter__返回值处的chain()函数来自于from itertools import chain,网上搜来的结果是这样的:Python中的chain()函数可以将多个迭代器组合起来,形成一个更大的迭代器。chain()函数的语法如下:itertools.chain(*iterables)其中,*iterables是一个可变参数,代表着可以传入多个可迭代的对象,如序列、列表、生成器等。chain()函数将这些可迭代对象连接起来成为一个更大的迭代器。大概用法应该是这样:
from itertools import chain
a=[1,2,3]
b=[4,5]
c=('*','*')
d = chain(a,b,c)
print(d)
for i in d:
print(i,end=' ')
#1 2 3 4 5 * *
'''输出
<itertools.chain object at 0x00000210F2869E40>
1 2 3 4 5 * *
'''
迭代器没学过,不过应该是一个可以遍历的东西
chain(rows,cols,squares)中rows,cols,squares都是二级列表,所以函数返回的是一个更迭代器,其中的元素是他们三个二级列表的所有元素,即一些一级列表
- 函数
def valid_data_types(self)最后的all(type(num) == int for num in chain(*self.grid))处的chain(*self.grid)。self.grid是个二级列表,那这里chain处理之后的结果应该是一些元素(即num)为一级列表的迭代器,但是前面判断元素类型却是type(num)==int。实际上chain(*self.grid)的作用是将列表self.grid中的一级列表们中的所有元素放到一个迭代器中。这里应该是*在起作用:
a=[[1,2],[3,4]]
print(*a)
'''输出
[1, 2] [3, 4]
'''
*将二级列表中的一级列表们取出来,变成多个一级列表,于是chain就能对它们操作了
- 在函数is_valid最后的
for zone in self处的self实际上是__iter__的返回值chain(rows, cols, squares),实验了一下:
from itertools import chain
class test(object):
def __iter__(self):
return chain([1,2,3])
aa=test()
print(aa)
print(list(aa))
for i in aa:
print(i,end=' ')
'''
<__main__.test object at 0x0000026A1442A0C0>
[1, 2, 3]
1 2 3
'''
这里如果把def __iter__(self)中的self去掉会在print(list(aa))处报错,报错为:
TypeError: test.iter() takes 0 positional arguments but 1 was given
如果把return chain([1,2,3])该为return [1,2,3]会在print(list(aa))处报错:
TypeError: iter() returned non-iterator of type 'list'
网上搜出来的东西也没看懂多少,似乎__iter__正常的用法类似于这样:
class test():
def __init__(self,end):
self.end=end
def __iter__(self):
print('__iter__被调用了')
self.a=-1
return self
def __next__(self):
print('__next__被调用了')
self.a+=1
if self.a>self.end:
raise StopIteration()
return self.a
for i in test(5):
print(i)
'''换成这样是一样的输出
a=test(5)
for i in a:
print(i)
'''
'''输出
__iter__被调用了
__next__被调用了
0
__next__被调用了
1
__next__被调用了
2
__next__被调用了
3
__next__被调用了
4
__next__被调用了
5
__next__被调用了
'''
看起来是要遍历test类的对象时会自动调用__iter__函数,每次遍历(包括第一次遍历以及结束时的那个没有遍历出结果的遍历)都会调用__next__函数,遍历出来的东西就是__next__的返回值
- 函数
is_valid(self)和函数valid_data_types(self)最后的返回处都出现了all()函数,以下来自菜鸟教程:
all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False
元素除了是 0、空、None、False 外都算 True。
函数等价于:
def all(iterable):
for element in iterable:
if not element:
return False
return True
使用例子:
print(all([1,1,1]))
print(all([1,1,0]))
'''输出
True
False
'''
print(all([True,True,True]))
print(all([True,True,False]))
'''输出
True
False
'''
(python)代码学习||2024.2.3||题目是codewars上的【Validate Sudoku with size `NxN`】的更多相关文章
- python代码学习day03-序列化学习pickle及json
#!/usr/bin/env python #coding:utf8 import pickle,json import datetime dic1 = {'name':'alex', 'age':4 ...
- 利用Python代码编写计算器小程序
import tkinter import tkinter.messagebox import math class JSQ: def __init__(self): #创建主界面 self.root ...
- 学习TensorFlow,浅析MNIST的python代码
在github上,tensorflow的star是22798,caffe是10006,torch是4500,theano是3661.作为小码农的我,最近一直在学习tensorflow,主要使用pyth ...
- 风炫安全web安全学习第三十二节课 Python代码执行以及代码防御措施
风炫安全web安全学习第三十二节课 Python代码执行以及代码防御措施 Python 语言可能发生的命令执行漏洞 内置危险函数 eval和exec函数 eval eval是一个python内置函数, ...
- 学习 27 门编程语言的长处,提升你的 Python 代码水平
Python猫注:Python 语言诞生 30 年了,如今的发展势头可谓如火如荼,这很大程度上得益于其易学易用的优秀设计,而不可否认的是,Python 从其它语言中偷师了不少.本文作者是一名资深的核心 ...
- 基于深度学习的人脸性别识别系统(含UI界面,Python代码)
摘要:人脸性别识别是人脸识别领域的一个热门方向,本文详细介绍基于深度学习的人脸性别识别系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中可以选择人脸图片.视频进行检 ...
- (数据科学学习手札144)使用管道操作符高效书写Python代码
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,一些比较熟悉pandas的读者 ...
- 基于深度学习的鸟类检测识别系统(含UI界面,Python代码)
摘要:鸟类识别是深度学习和机器视觉领域的一个热门应用,本文详细介绍基于YOLOv5的鸟类检测识别系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中可以选择各种鸟类图 ...
- Python基础学习Day6 is id == 区别,代码块,小数据池 ---->>编码
一.代码块 Python程序是由代码块构造的.块是一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是 ...
- 入门python:《Python编程从入门到实践》中文PDF+英文PDF+代码学习
入门python推荐学习久负盛名的python入门书籍<Python编程从入门到实践>. 书中涵盖的内容是比较精简的,没有艰深晦涩的概念,最重要的是每个小结都附带有"动手试一试& ...
随机推荐
- OKR之剑·实战篇04:OKR执行过程优化的那些关键事
作者:vivo 互联网平台产品研发团队 本文是<OKR 之剑>系列之实战第 4 篇--OKR执行过程不是一成不变的,团队和个人在执行中不断优化执行的具体行动,保障OKR的高效执行. 前言 ...
- spring中的核心类有那些,各有什么作用?
BeanFactory:产生一个新的实例,可以实现单例模式BeanWrapper:提供统一的get及set方法ApplicationContext:提供框架的实现,包括BeanFactory的所有功能 ...
- 你想怎么使用 Serverless 函数计算?(评测赢好礼 )
随着云计算发展,云原生热度攀升,Serverless 架构崭露头角且发展势头迅猛.不仅被更多开发者所关注,市场占有率也逐年提高.阿里云函数计算(Function Compute)是一个事件驱动的全托管 ...
- 二、redis主从环境搭建
系列导航 一.redis单例安装(linux) 二.redis主从环境搭建 三.redis集群搭建 四.redis增加密码验证 五.java操作redis 环境:centos7需要的安装包: redi ...
- vue tabBar导航栏设计实现5-最终版本
系列导航 一.vue tabBar导航栏设计实现1-初步设计 二.vue tabBar导航栏设计实现2-抽取tab-bar 三.vue tabBar导航栏设计实现3-进一步抽取tab-item 四.v ...
- 深入理解Kafka核心设计及原理(六):Controller选举机制,分区副本leader选举机制,再均衡机制
转载请注明出处:https://www.cnblogs.com/zjdxr-up/p/15026824.html 目录: 6.1.Kafka核心总控制器Controller 6.2.Controlle ...
- SD Host控制器微架构设计-02
SD_clk 测试模式下,选择hclk,将扫描链中的时钟保持一致 clk_en表示可以通过软硬件关闭时钟 sd_if模块 模块中设置一些寄存器,我们可以对寄存器进行读写或者对于寄存器中的某些域段进行读 ...
- 【rt-thread】board.h 文件中的内存大小配置如何决定
确认RAM种类及性质 使用STM32F429IGT6芯片,根据数据手册RAM大小是256KB,常规RAM是 256 - 64 在board.h中配置内存大小 在board.h中配置256则会出错在接口 ...
- CSS - 设置自动等比例缩放
img { width: 100vw; height: 100vh; object-fit: cover; }
- Kubernerts - 概览
1. Kubernerts K8s,是用于自动部署.扩容和管理容器化应用程序的开源系统 1.1 特性 自动化上线与回滚 分步骤针对应用或者配置更改上线,监控应用的运行状态同时不会终止所有实例,若出现问 ...