纸上得来终觉浅

这篇博客记录了作者在Python学习过程中的尝试和错误,涉及到类的定义、实例化、属性使用,包括类属性和实例属性的区别。还涵盖了文件操作,如r+模式的读写,以及错误处理中的AttributeError。此外,文章还展示了随机数选择、列表和元组操作、字符串比较和os模块的文件遍历功能。

绝知此事要躬行

这是我自己的试错文档,Python学习中会遇到一些问题,有些小问题不行直接百度,不如自己直接写来试试

试错代码

import random
#
#
class animal:
     def __init__(self,type):
         self.type = type
         weight =123

         # if self.type == 'taiger':
             # weight =

 test= animal('2333')

#测试random.choice可同时作用列表或元祖。结果ok
 test1 = [1,2]
 test2 = (1,2)
 print(random.choice(test2))

#尝试在不定参内传入多个类,结果ok
 class test_num:
     def __init__(self,a):
         self.a = a

 class  forest:
     def __init__(self,count,*monster):
         print(type(monster))
         for i in monster:
             print(i)

 test2 = forest(1,test_num(1).a,test_num(2).a)

#测试类属性和实例属性
#1.类熟悉必须init或其他方法外
#2.实例属性必须以self来承接
#3.类属性可通过对象和类名调用
#4.实例属性不可通过类名调用
#5.类属性不可在实例后更改
 class soldier:
     soldier_name = '普通人'
     soldier_price = 100
     def __init__(self):
         self.soldier_hp_max = 100 - self.soldier_price
         self.soldier_hp_now = 100

 test = soldier()
 print(test.soldier_)

#测试空列表长度是否为0,很明显是的
dic1 = [] 
print(len(dic1))

#测试字符串是否能相等
 if 'sed' == 'sed':
     print('1')

#测试os文件遍历
#a是当前目录,b是文件列表,c是文件列表
import os
for a,b,c in os.walk(r'.\test8_class'):
    print(a,b,c,'\n')

#字符串不可以通过索引直接修改,可以用replace实现
 a = '12345'
 a[2] = '2'

#关于 string 的 replace 方法,需要注意 replace 不会改变原 string 的内容。
#str.replace 实际返回的是一个修改了匹配文案的str
 a= '12345'
 a.replace('1','2')
 print(a)

#r+模式,r+模式从开始读,读完光标在最后,所以写的表现形式看起来是追加,而不是覆盖
 with open('test_file.txt','r+',encoding='utf-8') as text:
     a1 = text.readlines()
     text.writelines(a1)
     print(a1)

报错处理

在这里插入图片描述
AttributeError:
解释:找不到对象里的这个属性。原因是代码内weight既不是实例属性也不是类属性。
实例属性需要self。类属性需要写在方法外

第1关:批量处理 300 学习内容 参考答案 记录 评论 任务描述 相关知识 批量操作 编程要求 测试说明 任务描述 本关任务:使用batch()方法整合不同方式的请求。 相关知识 批量操作 如果我们去查看HBaseAPI的源码会发现,在上次实训中我们使用的delete、get,put这些批量操作,实际上都是调用了batch()方法。 查看put(List<Put> puts)函数源码: 我们可以发现put(List<Put> puts)方法最终还是调用的batch(final List<? extends Row> actions, final Object[] results, int rpcTimeout),其他get和delete的批量操作也同样。 所以我们如果既有get操作又有Put操作那是不是可以整合在一起呢? 答案是肯定的。 我们来看个例子: List<Row> rows = new ArrayList<>(); //上传操作 Put put = new Put(Bytes.toBytes("row1")); put.addColumn(Bytes.toBytes("data"),Bytes.toBytes("2"), Bytes.toBytes("value1")); rows.add(put); //删除操作 Delete delete = new Delete(Bytes.toBytes("row1")); delete.addColumn(Bytes.toBytes("data"),Bytes.toBytes("1")); rows.add(delete); //获取操作 Get get = new Get(Bytes.toBytes("row1")); get.addColumn(Bytes.toBytes("data"),Bytes.toBytes("2")); rows.add(get); //定义结果数组长度 Object[] results = new Object[rows.size()]; table.batch(rows, results);//这是一个同步的操作,批量操作的结果将会在操作之后放在results中 for (Object object : results) { System.out.println(object.toString()); } 上述代码delete和put操作的结果为keyvalues=NONE,即没有结果,当然如果get操作没有获取到结果也会输出keyvalues=NONE。 有结果则会输出类似这样的数据:keyvalues={row1/data:1/1543220978519/Put/vlen=7/seqid=0} 是一个Result类型的对象。 值的注意的是:最好不要将put和delete操作放在同一个批处理的请求中,因为这样会有很大的风险。在学习多线程的时候我们学过多线程三大特性之一有序性,也许会因为其他原因导致操作的实现顺序不同,这样会产生不可预料的结果,还有就是资源竞争,会使结果波动。 上述使用的是同步的方式进行批量操作,其实API还提供了一个异步执行的方法table.batchCallback(actions, results, callback): batchCallback( final List<? extends Row> actions, final Object[] results, final Batch.Callback<R> callback) 在我们需要使用异步执行批量操作,并且想要获取异步执行结果的时候可以考虑使用batchCallback()方法,Batch.Callback<R> callback就是异步执行结果的监听器。 编程要求 得来终觉,我们来实际操练吧,在右侧编辑器begin-end处编写代码补全batchOp(String tablename) 函数,参数:tablename为待操作表的表名,要求实现如下操作: 删除表中行键为row1,row2的行; 获取表中行键为row3,row10的行; 四个操作需要依照以上先后顺序,即先删除在获取row3,row10。 不需要你直接输出,只需要将批量操作的执行结果作为返回值返回即可。 测试说明 需要你先启动Hadoop和HBase,并等待HBase初始化完成。 预期输出: Row:null Row:null keyvalues=NONE keyvalues=NONE value30 value100 开始你的任务吧,祝你成功!
11-22
在HBase中,可以使用`batch()`方法整合不同类型的请求,以下是一个Java代码示例,用于删除表中行键为`row1`、`row2`的行,并获取表中行键为`row3`、`row10`的行: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class HBaseBatchExample { public static void main(String[] args) throws IOException { // 创建配置对象 Configuration config = HBaseConfiguration.create(); // 创建连接 try (Connection connection = ConnectionFactory.createConnection(config); // 获取Admin对象 Admin admin = connection.getAdmin()) { // 表名 TableName tableName = TableName.valueOf("your_table_name"); // 获取表对象 try (Table table = connection.getTable(tableName)) { // 创建一个List来存储不同类型的请求 List<Row> actions = new ArrayList<>(); // 添加删除row1和row2的请求 Delete delete1 = new Delete(Bytes.toBytes("row1")); actions.add(delete1); Delete delete2 = new Delete(Bytes.toBytes("row2")); actions.add(delete2); // 添加获取row3和row10的请求 Get get1 = new Get(Bytes.toBytes("row3")); actions.add(get1); Get get2 = new Get(Bytes.toBytes("row10")); actions.add(get2); // 执行batch请求 Object[] results = new Object[actions.size()]; table.batch(actions, results); // 处理获取行的结果 for (int i = 0; i < results.length; i++) { if (results[i] instanceof Result) { Result result = (Result) results[i]; if (!result.isEmpty()) { System.out.println("获取到行键为 " + Bytes.toString(result.getRow()) + " 的行数据"); } else { System.out.println("未找到行键为 " + Bytes.toString(actions.get(i).getRow()) + " 的行数据"); } } } } } } } ``` ### 代码说明: 1. **配置和连接**:使用`HBaseConfiguration.create()`创建配置对象,并通过`ConnectionFactory.createConnection(config)`建立与HBase的连接。 2. **获取表对象**:使用`connection.getTable(tableName)`获取指定表的对象。 3. **创建请求列表**:创建一个`List<Row>`来存储不同类型的请求,包括`Delete`和`Get`请求。 4. **添加请求**:分别添加删除`row1`、`row2`的`Delete`请求和获取`row3`、`row10`的`Get`请求到列表中。 5. **执行批量请求**:使用`table.batch(actions, results)`方法执行批量请求,并将结果存储在`results`数组中。 6. **处理结果**:遍历`results`数组,处理获取行的结果。 ### 注意事项: - 请将`"your_table_name"`替换为实际的表名。 - 确保HBase服务正常运行,并且配置信息正确。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值