用简单的代码案例学会某一门语言【Python】
事例1 拿下它!列表和元组相关
发现没有,这个关键的地方在于my_list发生了改变,在解释为何my_list
在运行之后发生了改变之前,我们先要了解Python中列表(list)和变量引用的基本概念。
列表(List)和变量引用
在Python中,列表是可变的数据类型,意味着你可以修改列表中的元素。当你将一个列表赋值给另一个变量时,你实际上是在创建一个新的变量,但它引用的是同一个列表对象。
代码分析
-
初始化列表和元组:
my_list = [4, 7, 'abc'] my_tuple = (9, 22, 'efg')
这里,
my_list
是一个包含三个元素的列表,而my_tuple
是一个包含三个元素的元组。 -
打印初始状态:
print('my_list = ', my_list) print('my_tuple = ', my_tuple)
这里简单打印出
my_list
和my_tuple
的初始值。 -
合并列表:
my_list2 = my_list + [66, 77]
这里,通过
+
操作符,my_list
和[66, 77]
被合并成了一个新的列表,并赋值给my_list2
。重要的是,my_list2
是一个全新的列表对象,它与my_list
是两个不同的对象。 -
修改列表:
my_list3 = my_list my_list3[1] = 'a new element'
my_list3 = my_list
:这里,my_list3
并没有创建一个新的列表对象,而是成为了my_list
的另一个引用,即它们现在指向同一个列表对象。my_list3[1] = 'a new element'
:由于my_list3
和my_list
指向同一个列表对象,修改my_list3
中的元素也会反映到my_list
上。
-
打印修改后的状态:
print('my_list = ', my_list) print('my_list2 = ', my_list2) print('my_list3 = ', my_list3)
my_list
和my_list3
显示的是同一个列表,因为my_list3
是my_list
的引用,并且这个列表的第二个元素已经被修改为'a new element'
。my_list2
仍然显示其初始的合并后的列表,因为它是一个与my_list
和my_list3
不同的列表对象。
结论
my_list
在运行之后发生了改变,是因为my_list3
是对my_list
的引用,而不是对my_list
的一个独立拷贝。因此,通过my_list3
对列表所做的任何修改都会影响到原始的my_list
对象。要创建一个my_list
的独立拷贝,可以使用列表的拷贝方法,如my_list3 = my_list.copy()
或my_list3 = list(my_list)
。如下所示:
接下来我们再看下一个事例:
关于if 和for
先看一个事例:
上面这个事例中可以看到使用if在取余符号下的使用规则。下面这个事例是关于for,仔细看代码,你是否预估正确?
在上面的代码中,整个流程是这样的:
s=0,n=0,s=0,n=0[output,without break loop];
n=1,s=0+1=1,n=1[output,without break loop];
n=2,s=1+2=3,n=2[output,without break loop];
n=3,s=3+3=6,n=3[output, break loop],s=6[output]
具体查看列表信息,则是通过下面的代码:
下面是用列表推导式赋予一个列表中具体的变量值:
上面的方括号内的元素,均为(0,1,2,3,4,…,10)的平方
字典的使用
字典的遍历逐项元素是用的是items属性,可以逐项遍历到每一个字典的元素。
下面再看具体的方法:
具体的factorial(4)方法执行流程如下:
1. n=4 as input, jump over if sentence, ret=1, x=1,ret=1*1;
2. still in for loop: x=2,ret=1*2=2;
3. still in for loop: x=3,ret=2*3=6;
4. still in for loop: x=4,ret=6*4=24;
5.Not in for loop, because x=5,break loop, return ret=24;
对于另外一个12!,这个同样是这个流程。
字符串的操作,重中之重!!!
下面的案例让你彻底理解字符串的操作,这里举例一个关于字符串的替换的功能,输入为input_str,pattern为即将要进行替换操作的内容(处理前),replace是替换后的显示的内容(处理后),下面看:
可以看到在具体的函数中,传参顺序不会影响具体的输出,只要传入的参数的名字有对应,就算没有按照函数定义的顺序来,依然可以进行有效正确的输出。
类class(拿下它!!!)
class Element:
def __init__(self, symbol, number):
self.symbol = symbol
self.number = number
def print_info(self):
print('Symbol: {} , Atomic Number: {}'.format(self.symbol, self.number))
class Metal(Element):
def __init__(self, symbol, number, is_shiny):
super().__init__(symbol, number)
self.is_shiny = is_shiny
gold = Metal('Au', number=79, is_shiny=True)
gold.print_info()
print('Gold {} shiny'.format('is' if gold.is_shiny else 'is not'))
这段代码定义了两个类:Element 和 Metal,并通过继承的方式将 Metal 类构建为 Element 类的子类。接下来,我将逐步分析这段代码的功能和潜在的问题。
Element 类
目的:这个类用于表示一个元素,具有两个属性:symbol(元素的符号)和 number(元素的原子序数)。
方法:
init(self, symbol, number):构造函数,用于初始化元素对象的 symbol 和 number 属性。
print_info(self):一个实例方法,用于打印元素的符号和原子序数。
Metal 类
目的:这个类继承自 Element 类,用于表示金属元素,并添加了一个额外的属性 is_shiny 来表示金属是否闪亮。
方法:
init(self, symbol, number, is_shiny):构造函数,首先通过 super().init(symbol, number) 调用父类 Element 的构造函数来初始化 symbol 和 number 属性,然后初始化 is_shiny 属性。
代码执行流程
创建一个 Metal 类的实例 gold,指定其符号为 ‘Au’,原子序数为 79,并设置 is_shiny 为 True。
调用 gold.print_info() 方法,该方法继承自 Element 类,打印出 gold 的符号和原子序数。由于 print_info 方法没有修改,它将打印出 ‘Au’ 和 79。
使用条件表达式和 format 方法打印出 gold 是否闪亮的信息。由于 gold.is_shiny 被设置为 True,所以将打印出 ‘Gold is shiny’。
随机的使用案例(绝招也!)
我们继续使用上面用到的my_list,下面是事例:
上面是一个tuple和list的相互转换,下面是unpacking tuple的操作。这个在实际代码中经常用到。
学会并且掌握上面操作,将可以应对绝大数python编写场景!当然,这个单纯是python,建议学习一日速成系列的pytorch、opencv以及后续的代码操作,将会事半功倍!!!!!!!!!!!