分类 默认分类 下的文章

8-gUJHttA242VwOeZ.png

复习一些基础知识

当复习基础知识时,你可以通过编写一些简单的代码来回顾基本的Python语法、变量、运算符,以及列表、字典、集合等基本数据结构的使用。以下是一些例子:

Python语法、变量、运算符复习:

# 基本语法
print("Hello, World!")

# 变量和数据类型
name = "John"
age = 25
height = 1.75

# 运算符
result = age * height
print(result)

# 条件语句
if age >= 18:
    print(f"{name} is an adult.")
else:
    print(f"{name} is a minor.")

列表(List)的使用:

创建列表

fruits = ['apple', 'banana', 'orange']

访问列表元素

print(fruits[0])  # 输出: apple

# 添加元素
fruits.append('grape')

# 修改元素
fruits[1] = 'kiwi'

# 删除元素
del fruits[2]

# 遍历列表
for fruit in fruits:
    print(fruit)

字典(Dictionary)的使用:

# 创建字典
person = {'name': 'Alice', 'age': 30, 'city': 'New York'}

# 访问字典元素
print(person['name'])  # 输出: Alice

# 添加或修改元素
person['gender'] = 'female'
person['age'] = 31

# 删除元素
del person['city']

# 遍历字典
for key, value in person.items():
    print(f"{key}: {value}")

集合(Set)的使用:

# 创建集合
colors = {'red', 'green', 'blue'}

# 添加元素
colors.add('yellow')

# 删除元素
colors.remove('green')

# 遍历集合
for color in colors:
    print(color)

深入学习函数和模块

学习如何定义函数、传递参数、返回值等。 掌握模块的概念,了解如何创建和使用模块。

当深入学习函数和模块时,你可以通过以下例子来了解如何定义函数、传递参数、返回值,以及如何创建和使用模块。

函数的定义、参数和返回值:

定义一个简单的函数

def greet(name):
    return f"Hello, {name}!"

# 调用函数
result = greet("Alice")
print(result)  # 输出: Hello, Alice!

# 函数参数可以有默认值
def power(base, exponent=2):
    return base ** exponent

# 调用带默认参数的函数
result = power(3)
print(result)  # 输出: 9

# 函数可以返回多个值
def calculate_stats(numbers):
    total = sum(numbers)
    average = total / len(numbers)
    return total, average

# 调用返回多个值的函数
total_sum, avg = calculate_stats([1, 2, 3, 4, 5])
print(f"Total Sum: {total_sum}, Average: {avg}")

模块的创建和使用:

假设你有两个文件:math_operations.py 和 main_program.py。

math_operations.py(模块文件)

# math_operations.py

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

main_program.py:

# main_program.py

# 导入自定义模块
import math_operations

# 使用模块中的函数
result_add = math_operations.add(5, 3)
result_subtract = math_operations.subtract(8, 4)

print(f"Addition Result: {result_add}")
print(f"Subtraction Result: {result_subtract}")

在这个例子中,math_operations.py 文件包含了两个简单的数学运算函数。通过在 main_program.py
中导入这个模块,你可以在主程序中使用模块中定义的函数。

通过这些例子,你可以更深入地理解如何定义函数、传递参数、返回值,以及如何创建和使用模块。这是进一步学习Python编程的基础,为后续的学习打下坚实的基础。

学习类和对象的基本概念。

熟悉继承、封装和多态的使用

类和对象的基本概念:

类的定义:

学习如何定义一个类,类是对象的模板,包含属性(成员变量)和方法(成员函数)。

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        print(f"{self.name} is barking!")

对象的创建和使用:

学习如何创建类的实例(对象)并使用它们。

my_dog = Dog("Buddy", 3)
print(f"{my_dog.name} is {my_dog.age} years old.")
my_dog.bark()

继承、封装、多态的使用:

继承:

学习如何使用继承创建子类,子类可以继承父类的属性和方法,并可以新增或覆盖它们。

class GoldenRetriever(Dog):
    def fetch(self):
        print(f"{self.name} is fetching the ball!")

my_golden = GoldenRetriever("Max", 2)
my_golden.bark()
my_golden.fetch()

封装:

理解封装的概念,即将类的实现细节隐藏起来,只向外部提供必要的接口。

class Circle:
    def __init__(self, radius):
        self.__radius = radius  # 使用双下划线进行私有属性的封装

    def get_radius(self):
        return self.__radius

    def set_radius(self, new_radius):
        if new_radius > 0:
            self.__radius = new_radius

my_circle = Circle(5)
print(f"Radius: {my_circle.get_radius()}")
my_circle.set_radius(8)
print(f"New Radius: {my_circle.get_radius()}")

多态:

了解多态的概念,即不同类的对象可以对相同的方法做出不同的响应。

class Cat:
    def make_sound(self):
        print("Meow!")

def animal_sound(animal):
    animal.make_sound()

my_dog = Dog("Buddy", 3)
my_cat = Cat()

animal_sound(my_dog)  # 输出: Buddy is barking!
animal_sound(my_cat)  # 输出: Meow!

通过理解和实践这些概念,你将更深入地了解面向对象编程在Python中的应用。这些概念是编写复杂程序和更容易维护的关键。

完整的应用展示面向对象的一些概念

当你理解了面向对象编程的基本概念后,可以尝试实现一个简单的应用来展示这些概念的完整应用。以下是一个简单的图书管理系统的示例,其中涉及类的定义、对象的创建、继承、封装和多态。

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author
        self.is_checked_out = False

    def check_out(self):
        if not self.is_checked_out:
            self.is_checked_out = True
            print(f"The book '{self.title}' by {self.author} has been checked out.")
        else:
            print("Sorry, the book is already checked out.")

    def check_in(self):
        if self.is_checked_out:
            self.is_checked_out = False
            print(f"Thank you for returning '{self.title}' by {self.author}.")
        else:
            print("The book is not checked out.")

    def display_info(self):
        status = "Available" if not self.is_checked_out else "Checked Out"
        print(f"Title: {self.title}, Author: {self.author}, Status: {status}")


class Library:
    def __init__(self):
        self.books = []

    def add_book(self, book):
        self.books.append(book)

    def list_books(self):
        print("Library Catalog:")
        for book in self.books:
            book.display_info()


# 创建图书对象
book1 = Book("The Great Gatsby", "F. Scott Fitzgerald")
book2 = Book("To Kill a Mockingbird", "Harper Lee")
book3 = Book("1984", "George Orwell")

# 创建图书馆对象
library = Library()

# 将图书加入图书馆
library.add_book(book1)
library.add_book(book2)
library.add_book(book3)

# 列出图书馆的所有图书
library.list_books()

# 借出和归还图书
book1.check_out()
book2.check_out()
book3.check_out()

# 再次列出图书馆的所有图书
library.list_books()

# 归还图书
book2.check_in()

# 最终列出图书馆的所有图书
library.list_books()

这个简单的图书管理系统包含了两个类:Book 和 Library。Book 类表示一本书,具有检出、归还和显示信息等方法。Library
类表示一个图书馆,包含了图书的集合,可以添加书籍并列出所有书籍。在这个示例中,你可以看到类的实例化、方法的调用、继承(没有显式的继承,但是通过对象的使用体现了类和对象的继承关系)、封装和多态的概念的应用。

通过这个示例,你可以更好地理解如何将面向对象编程的概念应用到实际的应用中。你还可以尝试扩展这个应用,例如添加用户类、图书馆管理员类等,以更全面地体现面向对象编程的特性。

8-BT7Tz6YA20nvp0M.png

  1. C++编程比赛题目:编写一个程序,接受一组数字的输入,然后统计并输出不超过这组数字的平均值的数字的个数
#include <iostream>
using namespace std;

int main() {
    int n;
    cout << "请输入数字的数量: ";
    cin >> n;

    // 声明一个数组来存储输入的数字
    int numbers[n];
    int sum = 0;

    // 输入数字
    for (int i = 0; i < n; i++) {
        cout << "请输入第 " << i + 1 << " 个数字: ";
        cin >> numbers[i];
        sum += numbers[i];
    }

    // 计算平均值
    double average = static_cast<double>(sum) / n;

    // 统计不超过平均值的数字的个数
    int count = 0;
    for (int i = 0; i < n; i++) {
        if (numbers[i] <= average) {
            count++;
        }
    }

    // 输出结果
    cout << "平均值为: " << average << endl;
    cout << "不超过平均值的数字个数为: " << count << endl;

    return 0;
}
  1. 输入一些数,求第二大的值
#include <iostream>
using namespace std;

int main() {
    int n;
    cout << "请输入数字的数量: ";
    cin >> n;

    if (n < 2) {
        cout << "至少需要输入两个数字才能找到第二大值。" << endl;
        return 1;
    }

    int first_max = INT_MIN;  // 初始最大值为负无穷
    int second_max = INT_MIN; // 初始第二大值为负无穷

    for (int i = 0; i < n; i++) {
        int num;
        cout << "请输入第 " << i + 1 << " 个数字: ";
        cin >> num;

        if (num > first_max) {
            second_max = first_max;
            first_max = num;
        } else if (num > second_max && num != first_max) {
            second_max = num;
        }
    }

    if (second_max == INT_MIN) {
        cout << "没有找到第二大值。" << endl;
    } else {
        cout << "第二大值为: " << second_max << endl;
    }

    return 0;
}
  1. 输入一些数,哪两个数最接近
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int main() {
    int n;
    cout << "请输入数字的数量: ";
    cin >> n;

    if (n < 2) {
        cout << "至少需要输入两个数字才能找到最接近的两个数字。" << endl;
        return 1;
    }

    vector<int> numbers;
    for (int i = 0; i < n; i++) {
        int num;
        cout << "请输入第 " << i + 1 << " 个数字: ";
        cin >> num;
        numbers.push_back(num);
    }

    int minDiff = abs(numbers[0] - numbers[1]);
    int closest1 = numbers[0];
    int closest2 = numbers[1];

    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            int diff = abs(numbers[i] - numbers[j]);
            if (diff < minDiff) {
                minDiff = diff;
                closest1 = numbers[i];
                closest2 = numbers[j];
            }
        }
    }

    cout << "最接近的两个数字是: " << closest1 << " 和 " << closest2 << endl;

    return 0;
}

效率更高一点算法?

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

int main() {
    int n;
    cout << "请输入数字的数量: ";
    cin >> n;

    if (n < 2) {
        cout << "至少需要输入两个数字才能找到最接近的两个数字。" << endl;
        return 1;
    }

    vector<int> numbers;
    for (int i = 0; i < n; i++) {
        int num;
        cout << "请输入第 " << i + 1 << " 个数字: ";
        cin >> num;
        numbers.push_back(num);
    }

    sort(numbers.begin(), numbers.end()); // 排序数组

    int minDiff = INT_MAX;
    int closest1, closest2;

    for (int i = 0; i < n - 1; i++) {
        int diff = numbers[i + 1] - numbers[i];
        if (diff < minDiff) {
            minDiff = diff;
            closest1 = numbers[i];
            closest2 = numbers[i + 1];
        }
    }

    cout << "最接近的两个数字是: " << closest1 << " 和 " << closest2 << endl;

    return 0;
}
  1. 统计字符1的个数
#include <iostream>
#include <string>
using namespace std;

int main() {
    string input;
    cout << "请输入一个字符串: ";
    cin >> input;

    int count = 0;

    for (char c : input) {
        if (c == '1') {
            count++;
        }
    }

    cout << "字符 '1' 的个数是: " << count << endl;

    return 0;
}
  1. 前n个整数顺序写在以其,数一数0~9的数字各出现多少次?
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cout << "请输入一个正整数 n: ";
    cin >> n;

    if (n <= 0) {
        cout << "请输入一个有效的正整数。" << endl;
        return 1;
    }

    vector<int> counts(10, 0); // 初始化一个长度为10,每个元素都为0的向量,用于统计0~9的出现次数

    for (int i = 1; i <= n; i++) {
        int num = i;
        while (num > 0) {
            int digit = num % 10; // 获取最低位的数字
            counts[digit]++; // 增加对应数字的计数
            num /= 10; // 去掉最低位
        }
    }

    // 输出各数字出现次数
    for (int i = 0; i < 10; i++) {
        cout << "数字 " << i << " 出现 " << counts[i] << " 次" << endl;
    }

    return 0;
}

8-es7xztRr0fgvXfT.png

编写一个程序,它将找到所有这些数字,可被7整除,但不是5的倍数,1000至2021(包括在内),输出这些数字并统计满足条件的数字的个数
count = 0  # 用于统计符合条件的数字的数量
result = []  # 存储符合条件的数字

for num in range(1000, 2022):
    if num % 7 == 0 and num % 5 != 0:
        result.append(num)
        count += 1

#print("1000到2021之间可被7整除但不是5的倍数的数字有:")
print(result)
print(f"{count}")
编写一个接受句子并计算字母和数字的程序
sentence = input("请输入一个句子: ")

# 初始化字母和数字的计数器
letter_count = 0
digit_count = 0

# 遍历句子中的每个字符

for char in sentence:
    if char.isalpha():  # 判断字符是否是字母
        letter_count += 1
    elif char.isdigit():  # 判断字符是否是数字
        digit_count += 1

print(f"字母 {letter_count}  数字{digit_count}")
输入一个正整数,输出这个正整数的的阶乘
def factorial(n):
    if n == 0:
        return 1
    else:
        result = 1
        for i in range(1, n + 1):
            result *= i
        return result

try:
    num = int(input("请输入一个正整数: "))
    if num < 0:
        print("请输入一个非负整数。")
    else:
        result = factorial(num)
        print(f"{num} 的阶乘是 {result}")
except ValueError:
    print("请输入一个有效的整数。")
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值的那两个整数,nums指定为:[2,7,11,15],target为用户手动输入。如果nums中找不到两个整数相加的和等于target,则输出不存在
def find_two_sum(nums, target):
    num_indices = {}  # 用于存储数字和它们的索引

    for index, num in enumerate(nums):
        complement = target - num  # 计算与当前数字配对的补数

        if complement in num_indices:
            # 如果补数在字典中,说明找到了一对配对的数字
            return [num_indices[complement], index]

        # 否则,将当前数字添加到字典中
        num_indices[num] = index

    return None  # 如果找不到配对的数字,返回None

# 用户输入目标值
try:
    target = int(input("请输入目标值: "))
    nums = [2, 7, 11, 15]  # 给定的数组
    result = find_two_sum(nums, target)

    if result is not None:
        print(f"和为目标值 {target} 的两个整数是: {nums[result[0]]} 和 {nums[result[1]]}")
    else:
        print("不存在两个整数的和等于目标值。")
except ValueError:
    print("请输入一个有效的整数作为目标值。")
卡拉兹(Callatz)猜想:对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。
对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
def collatz_steps(n):
    steps = 0  # 初始化步数

    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        steps += 1

    return steps

try:
    n = int(input("请输入一个不超过1000的正整数: "))
    if 1 <= n <= 1000:
        steps_needed = collatz_steps(n)
        print(f"需要 {steps_needed} 步才能得到 n=1。")
    else:
        print("请输入一个介于1和1000之间的正整数。")
except ValueError:
    print("请输入一个有效的整数。")
设计一个函数,输入为两个整数,输出为这两个数的最大公约数
比如,输入:5,15;输出:5
def find_gcd(a, b):
    while b:
        a, b = b, a % b
    return a

# 示例用法
num1 = int(input("请输入第一个整数: "))
num2 = int(input("请输入第二个整数: "))

gcd = find_gcd(num1, num2)
print(f"{num1} 和 {num2} 的最大公约数是 {gcd}")

定义一个函数,输入一个列表,并将列表中的头尾两个元素对调后返回
表,并将列表中的
def swap_first_and_last(lst):
    if len(lst) >= 2:
        lst[0], lst[-1] = lst[-1], lst[0]
    return lst

# 示例用法
input_list = [1, 2, 3, 4, 5]
result = swap_first_and_last(input_list)
print(result)
输入一个正整数n,输出从1到这个正整数n(包括n)的所有正整数的和
def sum_of_integers_up_to_n(n):
    if n < 1:
        return "请输入一个正整数。"
    
    total = 0
    for i in range(1, n + 1):
        total += i
    return total

try:
    n = int(input("请输入一个正整数 n: "))
    result = sum_of_integers_up_to_n(n)
    if type(result) == int:
        print(f"从1到{n}的所有正整数的和是: {result}")
    else:
        print(result)
except ValueError:
    print("请输入一个有效的整数。")
定义一个函数sort_list(),功能为将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。即输入为两个升序列表,输出为合并后的升序列表
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def sort_list(l1, l2):
    # 创建一个哑结点作为新链表的头部
    dummy = ListNode()
    current = dummy  # 用于遍历新链表

    while l1 is not None and l2 is not None:
        if l1.val < l2.val:
            current.next = l1
            l1 = l1.next
        else:
            current.next = l2
            l2 = l2.next
        current = current.next

    # 将剩余的节点连接到新链表
    if l1 is not None:
        current.next = l1
    if l2 is not None:
        current.next = l2

    return dummy.next  # 返回新链表的头部

示例用法

创建两个升序链表

l1 = ListNode(1, ListNode(3, ListNode(5)))
l2 = ListNode(2, ListNode(4, ListNode(6)))

merged_list = sort_list(l1, l2)

# 打印合并后的升序链表
while merged_list:
    print(merged_list.val, end=" ")
    merged_list = merged_list.next
给你一个整数 x ,如果 x 是一个回文整数,输出 true ;否则,输出 false
def is_palindrome(x):
    if x < 0:
        return False

    x_str = str(x)
    return x_str == x_str[::-1]

# 示例用法
num = int(input("请输入一个整数: "))
result = is_palindrome(num)

if result:
    print("是回文整数")
else:
    print("不是回文整数")
猴子偷桃问题:有一只猴子摘了若干个桃子,第一天吃了一半,还不过瘾,又多吃了一个;第二天吃了剩下的一半,还不过瘾,又多吃了一个;以后每天都是吃剩下的一半加一个。编写程序,输入天数和剩下的桃子数,计算猴子摘了多少桃子。
def calculate_starting_peaches(days, peach_left):
    peaches = peach_left

    for day in range(days - 1, 0, -1):
        peaches = (peaches + 1) * 2

    return peaches

try:
    days = int(input("请输入天数: "))
    peach_left = int(input("请输入剩下的桃子数: "))
    
    if days <= 0 or peach_left <= 0:
        print("请输入正整数天数和桃子数。")
    else:
        starting_peaches = calculate_starting_peaches(days, peach_left)
        print(f"一开始有 {starting_peaches} 个桃子。")
except ValueError:
    print("请输入有效的整数。")

PYPL指数-编程语言流行榜

PYPL指数-编程语言流行榜

PYPL编程语言受欢迎指数是通过分析在Google上搜索语言教程的频率来创建的。

一个语言教程被搜索得越多,就被认为该语言越受欢迎。这是一个领先的指标。原始数据来自Google趋势。

如果你相信集体智慧,PYPL编程语言受欢迎指数可以帮助你决定学习哪种语言,或者在新的软件项目中使用哪种语言。
All.png

Worldwide, Jun 2023 compared to a year ago:

Rank
Change Language Share Trend
1 Python 27.66 % +0.2 %
2 Java 16.16 % -1.3 %
3 JavaScript 9.44 % -0.2 %
4 C# 6.79 % -0.5 %
5 C/C++ 6.6 % -0.1 %
6 PHP 5.04 % -0.4 %
7 R 4.17 % -0.3 %
8 TypeScript 3.11 % +0.5 %
9 Swift 2.38 % +0.2 %
10 Rust 2.24 % +0.8 %
11 Objective-C 2.07 % -0.1 %
12 Go 2.02 % +0.3 %
13 Kotlin 1.82 % +0.1 %
14 Matlab 1.55 % -0.2 %
15 Ruby 1.12 % +0.2 %
16 Ada 0.97 % +0.3 %
17 Powershell 0.94 % +0.2 %
18 VBA 0.87 % -0.0 %
19 Dart 0.82 % -0.0 %
20 Lua 0.64 % +0.1 %
21 Scala 0.59 % -0.1 %
22 Abap 0.53 % +0.1 %
23 Visual Basic 0.48 % -0.1 %
24 Julia 0.42 % +0.0 %
25 Groovy 0.42 % +0.0 %
26 Cobol 0.41 % +0.2 %
27 Perl 0.35 % +0.1 %
28 Haskell 0.24 % -0.0 %
29 Delphi/Pascal 0.14 % +0.1 %
© Pierre Carbonnelle, 2023

其他指数可以参考PYPL主页

RaspberryPi配置ftp HomeStash文件同步

raspberry pi配置成一个家用的小型文件同步服务器,配合手机应用HomeStash使用

手机上的图片、视频可以方便备份到服务器上,节约手机空间,也免得花费不少银子使用iCloud:)
HomeStash花了几十块rmb
对于iphone手机应用开发不熟悉,android我准备自己写一个

参考

step 1 更新系统package

sudo apt update
sudo apt full-upgrade

step 2 安装ftp软件

sudo apt install vsftpd

step 3 编辑配置文件

sudo vim /etc/vsftpd.conf

write_enable=YES
local_umask=022
chroot_local_user=YES
anonymous_enable=YES => anonymous_enable=NO

user_sub_token=$USER
local_root=/home/$USER/FTP
allow_writeable_chroot=YES




=>这个可以随便选择其他可以访问的目录,比如我/media/pi/backup/FTP

step 4 创建实际的FTP目录

ftp根目录不能写,所以建立子目录
mkdir -p /home/$USER/FTP /[subdirectory_name]=>根据实际修改

mkdir -p  /media/pi/backup/FTP/homestash

step 5 修改权限

chmod a-w /home/[user]/FTP / =>使用实际user替换

step 6 重启 sftpd daemon

sudo service vsftpd restart

FTP服务器测试

使用filezilla,这个比较简单,下载安装Filezilla

sudo apt install filezilla
在家里局域网,透过ip,username,password访问

HomeStash使用

主要步骤:

  • 配置ftp链接
  • 选择ftp服务器上的目录 ,用来存储移动设备上传的图片、文件等
  • 选择设备上需要同步的目录 启动/暂停同步
看pihone上主要是图片,相册,需要补充一些使用截图