C++基础讲解第三期(超详细)每天更新哈,大家一起加油

Posted Alex、WY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++基础讲解第三期(超详细)每天更新哈,大家一起加油相关的知识,希望对你有一定的参考价值。

C++基础讲解第三期 代码中也有对应知识注释,别忘看,一起学习!

一、面向编程练习(根据前两篇笔记,先来个题目练练手吧)

要求:设计一个圆形类和一个点类,计算点在圆外还是圆内还是圆上,求点和圆的关系


  1. 属性:横坐标和纵坐标
    方法:点和点之间的距离

  2. 属性:圆心,半径
    方法:设置圆心和半径,判断点和圆的关系
//circle.cpp
#include"circle.h"
#include<cmath>

void Dit::set(int x, int y)

    m_x = x;
    m_y = y;


int Dit::getx()

    return m_x;


int Dit::gety()

    return m_y;


double Dit::Distance(Dit d)

    double s;
    s = sqrt((d.m_x - m_x)*(d.m_x - m_x) + (d.m_y-m_y)*(d.m_y-m_y));
    cout << "d.m_x = " << d.m_x << "d.m_y = " << d.m_y<<"m_x= "<< m_x<<"m_y= "<< m_y <<endl;
    cout << "两点之间的距离是:" << s << endl;
    return s;


void Circle::set(int x, int y, int r)

    m_d.set(x ,y);
    m_r = r;


void Circle::Relationship(Dit d)

    double distance = d.Distance(m_d);
    if(distance == m_r)
    
        cout<< "点在圆上" << endl;
    
    else if(distance > m_r)
    
        cout << "点在圆外" << endl;
    
    else
    
        cout << "点在园内" << endl;
    

//circle.h
#ifndef _H_CIRCLE_
#define _H_CIRCLE_

#include<iostream>
using namespace std;

class Dit

    private:
        int m_x;
        int m_y;
    public:
        double Distance(Dit d);
        void set(int x, int y);
        int getx();
        int gety();
;

class Circle

    private:
        Dit m_d;
        int m_r;

    public:
        void set(int x, int y, int r);
        void Relationship(Dit d);
;

#endif
#include"circle.h"

int main()

    int d_x = 1;
    int d_y = 1;

    Dit d;
    Circle c;
    d.set(1, 1);
    c.set(3, 4, 5);

    c.Relationship(d);
    return 0;

二、对象的构造和析构

1、构造函数

在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显示调用(也不能调用),而且在创建对象的时候自动执行。这种特殊的成员函数称为构造函数

几点说明:
1.构造函数的函数名和类名必须相同
2.构造函数不能有返回值,函数体内不能有return语句
3.构造函数在定义对象时会自动调用,不需要手动调用

#include<iostream>
using namespace std;

class Array

    private:
        int *data;  //数组的起始地址
        int size;   //数组的大小

    public:
        Array();    //无参构造函数,函数名和类名相同,没有返回值,完成对象的初始化操作
        void SetVal(int index,int val);
        int GetVal(int index);
        ~Array(); //析构函数,函数名是:类名+~,没有返回值
;

Array::Array()

    cout<<"array的无参构造函数"<<endl;
    size = 5;
    data = (int *)malloc(sizeof(int)*size);
   

void Array::SetVal(int index,int val)

    data[index] = val;


int Array::GetVal(int index)

    return data[index];


Array::~Array() //析构函数,函数名是:类名+~,没有返回值

    cout<<"Array的析构函数"<<endl;
    if(NULL != data)
    
        free(data);
        data = NULL;
    


int main()

    Array a1; //创建对象时自动调用构造函数
    for(int i = 0; i < 5; i++)
    
        a1.SetVal(i,i+1);
    

    for(int i = 0;i<5;i++)
    
        cout << a1.GetVal(i) << "" <<endl;
    

    return 0;


输出为:
array的无参构造函数
1 2 3 4 5
Array的析构函数

2.构造函数的重载和调用

和普通函数一样,构造函数时允许重载的,一个类可以有多个重载的构造函数,在创建对象时根据传递的实参去决定调用哪个构造函数。

#include<iostream>
using namespace std;

class Array

    private:
        int *data;  //数组的起始地址
        int size;   //数组的大小

    public:
        Array();    //无参构造函数,函数名和类名相同,没有返回值,完成对象的初始化操作
        Array(int s); //有参构造函数
        Array(int s, int z); //有两个参数的构造函数
        void SetVal(int index,int val);
        int GetVal(int index);
        ~Array(); //析构函数,函数名是:类名+~,没有返回值
;

Array::Array()

    cout<<"array的无参构造函数"<<endl;
    size = 5;
    data = (int *)malloc(sizeof(int)*size);
   

Array::Array(int s)

    size = s;
    data = (int *)malloc(sizeof(int)*size);
    cout <<"Array的有参构造函数, size = " << size <<endl;


Array::Array(int s, int z)

    size = s;
    data = (int *)malloc(sizeof(int)*size);
    cout <<"Array的两个参数的构造函数, size= "<< size << endl;


void Array::SetVal(int index,int val)

    data[index] = val;


int Array::GetVal(int index)

    return data[index];


Array::~Array() //析构函数,函数名是:类名+~,没有返回值

    cout<<"Array的析构函数"<<endl;
    if(NULL != data)
    
        free(data);
        data = NULL;
    


int main()

    /*
    Array a1; //创建对象时自动调用构造函数
    for(int i = 0; i < 5; i++)
    
        a1.SetVal(i,i+1);
    

    for(int i = 0;i<5;i++)
    
        cout << a1.GetVal(i) << "" <<endl;
    
*/
    Array a2(6);//初始化方式为括号法
    Array a3(7,8);

    Array a4 = 100;//初始化方法为等号法,有局限,只能有一个参数
    return 0;

运行结果:
Array的有参构造函数, size = 6
Array的两个参数的构造函数, size= 7
Array的有参构造函数, size = 100
Array的析构函数
Array的析构函数
Array的析构函数

3、拷贝构造函数

1.概念
格式:className(const className &obj)
拷贝构造函数也称为赋值拷贝构造函数
作用:用一个已有的对象去初始化另一个对象

Array::Array(const Array &a)

    cout<<"Array的拷贝构造函数"<<endl;

2.拷贝构造函数调用的时机
1)用一个对象初始化另一个对象
Array a5 = a4;
Array a6(a4);
Array a7 = Array(a4);
2)当函数的形参是一个对象时,比如:

void print(Array a)

    a.GetVal(1);

Array a1;
print(a1);

输出结果为:
Array的有参构造函数, size = 100
Array的拷贝构造函数
Array的析构函数
Array的析构函数
注意:这里,我在有参的构造函数中,给data指针分配了内存,在析构中free了内存,所以当我们在拷贝构造函数中没有给指针分配内存时,那么这个指针的内存会被释放两次,那么就会发生crash,这一点后面会讲到。这里没有crash是因为我将析构函数中的free函数注释了

3)函数返回值是一个对象

Array& Func()

    Array a1;
    return a1;


Array a2 = Func();

首先会调用无参构造函数,因为Func中创建了a1对象,将a1 return时,会产生匿名对象(没有名字的对象),因为这时候a1被释放了(因为a1是局部的),那么这时候用这个a1匿名对象初始化a2,就会调用匿名对象的拷贝构造函数,编译器实际上不会给a2分配空间,而是将匿名对象给了a2,直接用a2给这个匿名对象命名,所以不会产生两次拷贝构造。

3、深拷贝

#include<iostream>
using namespace std;

class Array

    private:
        int *data;
        int size;

    public:
        Array(int s)
        
            cout <<"array的有参构造函数"<<endl;
            size = s;
            data = (int *)malloc(sizeof(int)*size);
        

        ~Array()
        
            cout <<"array的析构函数"<<endl;
            if(data != NULL)
            
                free(data);
                data = NULL;
            
        

        Array(Array &a)//深拷贝构造函数
        
            cout <<"array的深拷贝构造函数"<< endl;
            size = a.size;
            data = (int*)malloc(sizeof(int)*size);//和浅拷贝的区别在于,重新给指针分配了空间,用于保存数组中的值。不会和被拷贝的数组同用一片空间

            for(int i = 0; i < size; i++)
            
                data[i] = a.data[i];
            
        
;

int main()

    Array a1(10);
    Array a2(a1);

    return 0;
    
输出:
array的有参构造函数
array的深拷贝构造函数
array的析构函数
array的析构函数

4、默认构造函数

#include<iostream>
using namespace std;

class Test

    public:
    Test()
    
        cout <<"Test 的无参构造函数"<<endl;
    

    Test(int a)
    
        cout <<"Test 的一个参数构造函数"<<endl;
    

    Test(const Test &a)
    
        cout <<"Test 的拷贝构造函数"<<endl;
    
;

int main()

    Test t1;//编译器会默认提供无参构造函数
    Test t2(t1);//编译器会提供默认的拷贝构造函数(浅拷贝)
    Test t3;//一旦提供了无参构造函数,编译器就不再提供无参构造函数
    Test t4;//一旦提供了有参的构造函数,编译器不会再提供默认的无参构造函数
    Test t5;//一旦提供了拷贝构造函数,编译器也不会再提供默认的无参构造函数
    return 0;

5、析构函数

1). 格式: ~Array()析构函数
2). 概念:
当一个对象销毁时,系统会自动调用一个函数来进行清理工作,如释放内存,关闭打开的文件,这个函数就是析构函数。
析构函数没有参数,不能被重载,一个类中只能有一个析构函数,如果用户没有提供析构函数,编译器会自动生成一个默认的析构函数。

6、匿名对象

#include<iostream>
using namespace std;

class Test

    public:
    Test()
    
        cout <<"Test 的无参构造函数"<<endl;
    

    Test(int a)
    
        cout <<"Test 的一个参数构造函数"<<endl;
    

    Test(const Test &a)
    
        cout <<"Test 的拷贝构造函数"<<endl;
    

    ~Test()
    
        cout<<"test的析构函数"<<endl;
    
;

int main()

    Test(); //匿名对象,本行代码执行完毕,立即被释放,也就是立即调用析构函数
    cout<<"*************"<<endl;
    return 0;

7、对象的动态创建和释放(malloc、free、new、delete)

1) c++中 malloc使用

#include<iostream>
using namespace std;

class Test

    public:
    Test()
    
        cout <<"Test 的无参构造函数"<<endl;
    

    Test(int a)
    
        cout <<"Test 的一个参数构造函数"<<endl;
    

    Test(const Test &a)
    
        cout <<"Test 的拷贝构造函数"<<endl;
    

    ~Test()
    
        cout<<"test的析构函数"<<endl;
    
;

int main()

    //Test t1; 栈空间创建对象
    //c++中不用malloc,是因为其不会自动调用构造函数和析构函数
    Test *pt = (Test *)malloc(sizeof(Test));//在堆空间申请一个对象大小的内存
    if(NULL == pt)
    
        cout << "malloc is failed" <<endl;
    

    free(pt);
    pt = NULL;


    Test *pt2 = new Test; //在堆中申请内存,并且自动调用构造函数

    delete pt2; //自动调用析构函数
    pt2 = NULL;
	
	int *p2 = new int;//给整形分配空间
	delete p3;
	p3 = NULL;

	char *p3 = new char;//给一个字符申请空间
	delete p3;
	p3 = NULL;

	char *p4 = new char[10]; //给10个字符申请空间
	detele []p4;
	p4 = NULL;

	Test *t2 = new Test(1);//给一个Test对象申请空间,并且初始化
	delete t2;
	t2 = NULL;

	Test *t3 = new Test[5]1,2,3,4,5;//申请十个Test类对象,并初始化
    return 0;

2)malloc和new的区别?

1.malloc是函数,new是关键字
2.malloc的返回值类型是void*, new是申请空间的类型
3.malloc不能初始化空间,new可以初始化
4.malloc不能自动调用构造函数,new可以

8、构造函数的参数初始化列表

#include<iostream>
using namespace std;

class Date

    private:
        int m_year;
        int m_month;
        int m_day;

    public:
       /* Date()
        
            cout<<"data的无参构造函数"<<endl;
            m_year = 1998;
            m_month = 6;
            m_day = 28;
        
        */
        Date(int y, int m, int d)
        
            cout << "data的有参构造函数"<< endl;
            m_year = y;
            m_month = m;
            m_day = d;
        

        ~Date()
        
            cout <<"data的析构函数"<< endl;
        
;

calss Test

	private:
		Test

超详细的 Python 基础语句总结(多实例视频讲解持续更新)

目录

一、运算符

1.1 + ——两个对象相加

+ 运算符用于实现 2 个对象的相加。视频讲解链接如下:

https://www.bilibili.com/video/BV1Ao4y1m7nh

【示例1】数字相加。在 Python 中,经常会遇到使用 + 进行数值相加的情况,常用应用如下:

a = 13
b = 2
c = 4.0
d = 5.0
print(a + b)  # 整数相加 15
print(c + d)  # 浮点数相加 9.0
print(a + c)  # 整数和浮点数相加 17.0
print(a + .5)  # 整数和省略零的浮点数相加 13.5

【示例2】字符串相加。在 Python 中,如果 + 号的两侧是字符串类型数据,则表示将 2 个字符串进行拼接。常用应用如下:

s1 = 'Amo'
s2 = 'Xiang'
print(s1 + s2)  # 字符串拼接
print(s1 + ' ' + s2)  # 2个字符串间添加空格
print(s1 + '\\n' + s2)  # 2个字符串间添加换行符

程序执行结果如下图所示:
在这里插入图片描述
【示例3】元组、列表相加。当元组、列表使用 + 相加时,返回合并后的元组、列表。常用应用如下:

t1 = (1, 2, 3)
t2 = (4, 5, 6)
t3 = ('a', 'b', 'c')
t4 = ('d', 'e', 'f')
t5 = (('o', 'p', 'q'), ('x', 'y', 'z'))
print(t1 + t2)  # (1, 2, 3, 4, 5, 6)
# (1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 'e', 'f')
print(t1 + t2 + t3 + t4)
# (1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 'e', 'f', ('o', 'p', 'q'), ('x', 'y', 'z'))
print(t1 + t2 + t3 + t4 + t5)

print("*" * 90)
l1 = [1, 2, 3]
l2 = [4, 5, 6]
l3 = [['a', 'b', 'c']]
l4 = [['d', 'e', 'f']]
l5 = [['o', 'p', 'q'], ('x', 'y', 'z')]
print(l1 + l2)  # [1, 2, 3, 4, 5, 6]
# [['a', 'b', 'c'], ['d', 'e', 'f']]
print(l3 + l4)
# [1, 2, 3, 4, 5, 6, ['a', 'b', 'c'], ['d', 'e', 'f'], ['o', 'p', 'q'], ('x', 'y', 'z')]
print(l1 + l2 + l3 + l4 + l5)

说明:字典和集合不能使用“+”进行操作。
在这里插入图片描述
说明:不同数据类型,不能直接进行 + 运算。如下:
在这里插入图片描述

1.2 - ——得到负数或是一个数减去另一个数

- 运算符在 Python 中有两个作用,一个是作为负号使用,在数字前表示负数;另一个是作为减号,表示前一个数字减去后一个数字。

【示例1】作为负号使用。作为负号使用时,注意负负为正。常用应用如下:

num1 = 4
num2 = -5
num3 = -6.0
print(-num1)  # -4
print(num2)  # -5
print(-num3)  # 6.0

【示例2】作为减号使用。作为减号使用时,常用应用如下:

num1 = 5
num2 = 1
num3 = 10
num4 = 8.0
print(num1 - num2)  # 4
print(num1 - num3)  # -5
print(num1 - num4)  # -3.0

1.3 * ——两个数相乘或是返回一个被重复若干次的字符串、列表、元组

* 运算符在 Python 中有两个作用,一个是作为乘号使用,表示两个数相乘;另一个是和整数 n 组合,作为重复符号使用,表示字符串、列表、元组重复 n 次。

【示例1】作为乘号使用。作为乘号使用时,常用应用如下:

num1 = 3
num2 = 4
num3 = 5.5
num4 = -6
print(num1 * num2)  # 12
print(num1 * num3)  # 16.5
print(num1 * num4)  # -18

【示例2】对字符串使用*号。使用“*”作为重复符号,打印一个等腰三角形。代码如下:

print(' ' * 2 + '*' + ' ' * 2)
print(' ' + '*' * 3 + ' ')
print('*' * 5)

【示例3】对元组使用*号。“*”号作为重复符号,同样可以作用在元组上。

l1 = (1, 2, 3)
l2 = (('a', 'b', 'c'), ('d', 'e', 'f'))
# (1, 2, 3, 1, 2, 3, 1, 2, 3)
print(l1 * 3)
# (('a', 'b', 'c'), ('d', 'e', 'f'), ('a', 'b', 'c'), ('d', 'e', 'f'))
print(l2 * 2)

【示例4】对列表使用*号。“*”号作为重复符号,同样可以作用在列表上。

l1 = [1, 2, 3]
l2 = [['a', 'b', 'c']]
board = [['-'] * 3 for i in range(3)]  # 使用列表解析式
# [1, 2, 3, 1, 2, 3, 1, 2, 3]
print(l1 * 3)
# [['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
print(l2 * 3)
# [['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']]
print(board)

1.4 / ——两个数相除

/ 运算符用于实现 2 个对象的相除。

【示例1】实现人民币和美元的转换。已知1美元兑换人民币 6.78 元,编写程序实现人民币转换成美元的功能。代码如下:

exchange_rate = 6.78  # 汇率
RMB = input('请输入人民币金额:')
try:
    US = float(RMB) / exchange_rate
    print('转化后的美元是:{:.2f}'.format(US))
except ValueError:
    print('请输入正确的数值类型。')

程序执行结果如下图所示:
在这里插入图片描述

1.5 // ——返回商的整数部分(向下取整)

// 运算符用于取整除,返回商的整数部分,注意向下取整。例如 8 // 3 = 2。

【示例1】将描述“秒”转化为“分 秒”的格式。在考试系统中需要记录用户的答题时间。通常答题时间是以秒为单位记录的。比如用时“100”秒,为了增加可读性,需要将“100秒”转化为“1分钟40秒“的形式。如下代码,可以实现该功能:

def second_format(seconds):
    minutes = seconds // 60  # 计算分钟数
    if minutes > 0:
        seconds = seconds - minutes * 60  # 计算剩余秒数
    return minutes, seconds


i = 2
while i > 0:
    seconds = input('请输入秒数:')
    result = second_format(int(seconds))
    print(f'{seconds}秒可以转化为{result[0]}分{result[1]}秒')
    i -= 1

程序执行结果如下图所示:
在这里插入图片描述
【示例2】统计程序运行所占用的内存。psutil 是个跨平台库模块,能够轻松实现获取系统运行的进程和系统利用率,包括CPU、内存、磁盘、网络等信息。使用“pip install psutil”命令安装psutil模块,然后统计程序运行所占用的内存,并将其转化MB单位大小。代码如下:

import os
import psutil


def show_memory_info(hint):
    """显示当前Python程序占用的内存大小"""
    pid = os.getpid()
    p = psutil.Process(pid)
    info = p.memory_full_info()
    memory = info.uss / 1024. / 1024  # 1MB = 1024KB = 1024B
    print('{} memory used: {} MB'.format(hint, memory))


# 测试函数占用多少内存
show_memory_info('initial')
list_val = [i for i in range(10000000)]
show_memory_info('finished')

程序执行结果如下图所示:
在这里插入图片描述

1.6 % ——返回除法的余数

% 运算符用于取模,返回除法的余数,例如 8%2 结果为 0,8%3 结果为2。

【示例1】负数使用%求余数。计算下面的除法求余结果:

result1 = 8 % 3
result2 = -8 % 3
result3 = 8 % -3
result4 = 0 % -3  # 0
result5 = 0 % 6  # 0
print(f"8  % 3 的结果是:{result1}")  # 2
print(f"-8 % 3 的结果是:{result2}")  # 1
print(f"8 % -3 的结果是:{result3}")  # -1

上面的结果可能与很多人的预期不符,这个结果是由 Python 机制决定的。在 Python 中取余数遵循下面的公式:

r=a-n*(a//n)
# r=a-n*(a//n)
# 8 % 3 ==> a=8,n=3 ==> 8-3*(8//3) ==> 8-3*2 ==> 2
# 注意:-8//3 计算时向下取整,结果为-3,而不是-2。
# -8 % 3 ==> a=-8,n=3 ==> -8-3*(-8//3) ==> -8-3*(-3) ==> -8+9 ==> 1
# 8 % -3 ==> a=8,n=-3 ==> 8-(-3)*(8//-3) ==> 8+3*(-3) ==> 8-9 ==> -1

1.7 ** ——返回一个数的幂

** 运算符用于返回一个数的幂,例如 2 ** 2 结果为4 ,2 ** 3 结果为8。

【示例1】用 3 种方式求 x 的 y 次幂。

import math

# 计算x的y次幂
x = 10
y = 3
# 方式1
print(x ** y)  # 1000
# 方式2
print(pow(x, y))  # 1000
# 方式3
print(math.pow(x, y))  # 返回类型为浮点型: 1000.0

1.8 = —— 简单的赋值

= 是简单的赋值运算符,例如将 a=1,表示将数值 1 赋值给变量 a。

【示例1】不同类型数据的赋值。

# 常用数据类型赋值
num = 123  # 数值
str_val = "Amo"  # 字符串
tuple_val = (1, 2, 3)  # 元组
list_val = [1, 2, 3]  # 列表
dict_val = {"name": "Amo", "age": 18}  # 字典
set_val = {1, 2, 3}  # 集合


def fun():
    print("函数赋值")


f = fun  # 函数赋值
f()  # 调用函数:函数赋值


class Student:

    def __init__(self):
        print("类赋值")


s = Student  # 类赋值
s()  # 类的实例化:类赋值

1.9 += —— 加法赋值

+= 是加法赋值运算符,例如将 a +=1,等价于 a=a+1。

【示例1】计算字典中各值的累加和。

basket = {"fruit": 45.80, "meat": 20.45, "juice": 10}  # 购物车数据
total = 0  # 初始化总价
# 方式1:
for item in basket.values():
    total += item
print(f'方式1的计算结果为{total}')
# 方式2:
total = sum(basket.values())
print(f'方式2的计算结果为{total}')

【示例2】将数字0-9自动转化为汉字。

numbers = input("请输入0-9之间的数字:")
digits_mapping = {
    "0": "零",
    "1": "壹",
    "2": "贰",
    "3": "叁",
    "4": "肆",
    "5": "伍",
    "6": "陆",
    "7": "柒",
    "8": "捌",
    "9": "玖",
}

output = ""
for number in numbers:  # 遍历输入的数字
    output += digits_mapping.get(number, "!") + " "  # 匹配字典的键,然后将结果连接在一起
print(output)

1.10 -= —— 减法赋值

-= 是减法赋值运算符,如加法运算符类似,例如将a -=1,等价于a=a-1。

【示例1】“逢7过”游戏。“逢7过”是一个锻炼头脑敏捷性的益智游戏。游戏规则是大家围成一圈,然后从1开始依序喊数字,如果数字是7或者7的倍数,就不能喊出这个数字,必须做一个动作。使用Python 计算出200以内的7的倍数。例如7、14、28等。代码如下:

value = 200  # 初始值
L = []
while value > 0:
    if value % 7 == 0:  # 如果被7整除
        L.append(value)  # 添加到列表
    value -= 1
L.reverse()  # 列表反转
print(L)  # 输出列表

1.11 *= —— 乘法赋值

“*=”是乘法赋值运算符,如加法运算符类似,例如将a *=3,等价于a = a*3。

【示例1】多种类型使用乘法赋值。对不同类型数据使用乘法赋值运算,代码如下:

# 数字
num = 5
num *= 3
print(num)  # 15
# 字符串
str_val = "Amo"
str_val *= 3
print(str_val)  # AmoAmoAmo
# 元组
tuple_val = (1, 2, 3)
tuple_val *= 3
print(tuple_val)  # (1, 2, 3, 1, 2, 3, 1, 2, 3)
# 列表
list_val = [1, 2, 3]
list_val *= 3
print(list_val)  # [1, 2, 3, 1, 2, 3, 1, 2, 3]

【示例2】计算摆满国际象棋所需要的麦子数。国际象棋共有64个格子,如果第一个小格内放入一粒麦子,在第二个小格内放入两粒,第三小格内放入给四粒,以此类推,每一小格内都比前一小格加一倍的麦子,直至放满64个格子,总共需要多少颗麦子。代码如下:

def getNumberOfWheat(grid):
    """
    获取放grid格时的麦子数
    :param grid: 格子数
    :return: 返回放满格子数时的麦子数量
    """
    g_sum = 0
    numberOfWhearInGrid = 1  # 第一个格子放置1粒
    g_sum += numberOfWhearInGrid  # 第一个格子的总粒数
    for i in range(2, grid + 1):  # 从第2个格子开始,遍历每一个格子
        numberOfWhearInGrid *= 2  # 下一个格子是前一个格子的2倍
        g_sum += numberOfWhearInGrid  # 计算所有格子中总粒数
    return g_sum


print(f"放满4个格子需要{getNumberOfWheat(4)}颗麦子")  # 由于第1个格子默认放置1,所以从第2个开始计算共63个格子
print(f'放满64个格子需要{getNumberOfWheat(64)}颗麦子')  # 由于第1个格子默认放置1,所以从第2个开始计算共63个格子

1.12 /= —— 除法赋值运算符

/= 是除法赋值运算符,例如将 a /=3,等价于 a = a/3。

【示例1】用2种方式对列表中的元素批量相除。

list_value = [1, 2, 3, 4, 5]
# 方式1:
new_value = [i / 2 for i in list_value]  # 使用列表解析式
print(new_value)  # [0.5, 1.0, 1.5, 2.0, 2.5]
# 方式2:
new_value = []
for i in list_value:
    i /= 2  # 除法赋值运算
    new_value.append(i)  # 追加到新列表
print(new_value)  # [0.5, 1.0, 1.5, 2.0, 2.5]

1.13 %= —— 取模赋值运算符

%= 是取模运算符,例如将 a %= 3,等价于a = a%3。

【示例1】对列表中的元素批量取模。

list_value = [10, 11, 12, 13, 14, 15]
new_value = []
for i in list_value:
    i %= 2  # 取模运算
    val = '奇数' if i else '偶数'  # 三元表达式
    new_value.append(val)  # 追加到新列表
print(new_value)  # ['偶数', '奇数', '偶数', '奇数', '偶数', '奇数']

1.14 **= —— 幂赋值运算符

“**=”是幂赋值运算符,例如将a **= 3,等价于a = a**3。

【示例1】用3种方式对列表中的元素批量求平方。

list_value = [1, 2, 3, 4, 5]
# 方式1:
new_value = [i ** 2 for i in list_value]  # 使用列表解析式
print(new_value)  # [1, 4, 9, 16, 25]
# 方式2
new_value = []
for i in list_value:
    i **= 2  # 幂赋值操作
    new_value.append(i)  # 追加到新列表
print(new_value)  # [1, 4, 9, 16, 25]
# 方式3
new_value = list(map(lambda x: x ** 2, list_value))
print(new_value)  # [1, 4, 9, 16, 25]

1.15 //= —— 取整除赋值运算符

“//=”是取整除赋值运算符,例如将a //= 3,等价于a = a//3。

【示例1】用3种方式对列表中的元素批量取整数赋值

list_value = [1, 2, 3, 4, 5]
# 方式1:
new_value = [i // 2 for i in list_value]  # 使用列表解析式
print(new_value)  # [0, 1, 1, 2, 2]
# 方式2
new_value = []
for i in list_value:
    i //= 2
    new_value.append(i)  # 追加到新列表
print(new_value)  # [0, 1, 1, 2, 2]
# 方式3
new_value = list(mapC++入门C和C++混合编程超详细讲解

C语言从入门到入土(进阶篇)函数栈帧的创建和销毁讲解(不看必后悔系列)(超详细)

大数据分析-零基础学Tableau+超详细讲解+示例练习

萌萌合伙人30千锋html5大前端超推荐大佬棒牛 90完结·082更新道长思考力训练营第三期·高清完整

C++初学必练基础题第三期

清华大佬超详细讲解进阶学Python之 Python的函数基础

(c)2006-2024 SYSTEM All Rights Reserved IT常识