代码结构和代码

import json
import random
import os
import re
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os, re
import random,readJSON

data = readJSON.读JSON文件("data.json")

名人名言 = data["famous"] # a 代表前面垫话,b代表后面垫话
前面垫话 = data["before"] # 在名人名言前面弄点废话
后面垫话 = data['after']  # 在名人名言后面弄点废话
古诗词 = data['bosh'] #古诗词

xx = "诗意"

重复度 = 2

def 洗牌遍历(列表):
    global 重复度
    池 = list(列表) * 重复度
    while True:
        random.shuffle(池)
        for 元素 in 池:
            yield 元素

下一句古诗词 = 洗牌遍历(古诗词)
下一句名人名言 = 洗牌遍历(名人名言)

def 来点名人名言():
    global 下一句名人名言
    xx = next(下一句名人名言)
    xx = xx.replace(  "a",random.choice(前面垫话) )
    xx = xx.replace(  "b",random.choice(后面垫话) )
    return xx

def 另起一段():
    xx = ". "
    xx += "\r\n"
    xx += "    "
    return xx


# 限定可见方法
__all__ = ["ChineseName"]

# ================
# 资源文件
# ================

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

LASTFILE = os.path.join(BASE_DIR, "source/lastnames.txt")
FIRSTFILE = os.path.join(BASE_DIR, "source/firstnames.txt")

BOYFILE = os.path.join(BASE_DIR, "source/boy.json")
GIRLFILE = os.path.join(BASE_DIR, "source/girl.json")

# ===================
# 主体代码
# ===================

class ChineseName(object):
    """中文名取名"""
    def __init__(self, firstname_file=FIRSTFILE, lastname_file=LASTFILE):
        """初始化
        Args:
            firstname_file: 名字文件路径 - String
            lastname_file:姓氏文件路径 - String
            以上两个路径参数有默认值,也可由用户自定义,文件内容以空格分隔即可
        """
        # 存储名字,便于多次调用 - List
        self._firstnames = self._getChars(firstname_file)

        # 存储姓氏,便于多次调用 - List
        self._lastnames = self._getChars(lastname_file)

        self._loadFirstName()

    def _getChars(self, filename):
        """获取中文字符列表
        Args:
            filename: 文件路径 - String (空格分隔文件)
        Returns:
            List: 字符列表
        Raise:
            file not find
        """
        if os.path.exists(filename):
            with open(filename, "r", encoding="utf-8") as f:
                chars = f.read().split(" ")
                return chars
        else:
            raise IOError("file not find!")

    def _loadFirstName(self):
        """
        加载男孩女孩名字
        """
        # 加载男孩名字 {dict}
        with open(BOYFILE, "r", encoding="utf-8") as f:
            self._boy_firstnames = json.loads(f.read())

        # 加载女孩名字 {dict}
        with open(GIRLFILE, "r", encoding="utf-8") as f:
            self._girl_firstnames = json.loads(f.read())

    def getLastName(self):
        """获取姓氏
        Args:
            None
        Returns:
            String: 姓氏
        """
        return random.choice(self._lastnames)

    def _getFirstName(self, char_count=1, sex="boy"):
        """
        获取名字
        :param char_count: {int} 名字字数
        :param sex: {str} 性别 (boy | girl)
        :return: {srt} 名字
        """
        firstnames = {
            "boy": self._boy_firstnames,
            "girl": self._girl_firstnames
        }

        try:
            return random.choice(firstnames.get(sex).get(str(char_count)))
        except KeyError:
            raise KeyError("please input char_count between 1-2")

    def getGirlFirstName(self, char_count=1):
        """
        获取一个女孩名字
        :param char_count:  {int} 名字字数
        :return: {str} 名字
        """
        return self._getFirstName(char_count, sex="girl")

    def getBoyFirstName(self, char_count=1):
        """
        获取一个男孩名字
        :param char_count:  {int} 名字字数
        :return: {str} 名字
        """
        return self._getFirstName(char_count, sex="boy")

    def getFirstName(self, char_count=1, sex=None):
        """获取名字
        Args:
            char_count: {int} 名字长度,默认1
            sex: {str} 性别(boy | girl)
        Returns:
            String: 名字
        """
        if sex == "boy":
            firstname = self.getBoyFirstName(char_count)

        elif sex == "girl":
            firstname = self.getGirlFirstName(char_count)

        else:
            firstname = []
            for i in range(char_count):
                firstname.append(random.choice(self._firstnames))

            firstname = "".join(firstname)

        return firstname

    def getName(self, char_count=1, lastname="", sex=None):
        """获取一个中文姓名
        Args:
            char_count: 名字长度,默认1 - Integer
            lastname: 姓氏,默认随机 - String
            sex: {str} 性别(boy | girl)
        Returns:
            String: 姓名
        """
        name = []
        if lastname == "":
            name.append(self.getLastName())
        else:
            name.append(lastname)

        name.append(self.getFirstName(char_count, sex))
        name = "".join(name)
        return name

    def getBoyName(self, char_count=1, lastname=""):
        """
        获取男孩姓名
        :param char_count: {int} 名字长度,默认1
        :param lastname: {str} 姓氏 默认随机
        :return: {str} 姓名
        """
        return self.getName(char_count, lastname, sex="boy")

    def getGirlName(self, char_count=1, lastname=""):
        """
        获取女孩姓名
        :param char_count: {int} 名字长度,默认1
        :param lastname: {str} 姓氏 默认随机
        :return: {str} 姓名
        """
        return self.getName(char_count, lastname, sex="girl")

    def getNames(self, count, char_count=1, lastname="", sex=None):
        """获取一个中文姓名列表
        Args:
            count: 名字数量 - Integer
            char_count: 名字长度,默认1 - Integer
            lastname: 姓氏,默认随机 - String
            sex: {str} 性别(boy | girl)
        Returns:
            List: 姓名列表
        """
        names = []
        for i in range(count):
            names.append(self.getName(char_count, lastname, sex))
        return names

    def getNameGenerator(self, count, char_count=1, lastname="", sex=None):
        """获取一个中文姓名生成器,2018年1月22日
        Args:
            count: 名字数量 - Integer
            char_count: 名字长度,默认1 - Integer
            lastname: 姓氏,默认随机 - String
            sex: {str} 性别(boy | girl)
        Returns:
            Yield:姓名生成器
        """
        for i in range(count):
            yield self.getName(char_count, lastname, sex)
  
def ask_for_name_generation():
    count = int(input("请输入生成姓名的数量:"))

    char_count_input = input("是否指定姓名长度?(是/否,默认为1):")
    if char_count_input.lower() == "":
        char_count = int(input("请输入姓名长度:"))
    else:
        char_count = 1

    lastname = input("是否指定姓氏?(是/否,默认随机选择):")
    if lastname.lower() == "":
        lastname = input("请输入姓氏:")
    else:
        lastname = ""

    sex_input = input("是否指定性别?(是/否,默认为None):")
    if sex_input.lower() == "":
        sex = input("请输入性别(boy是1/girl是0):")
        sex = "boy" if sex == "1" else "girl"
    else:
        sex = None

    # 调用提供的函数
    cname = ChineseName()  
    generator = cname.getNameGenerator(count=count, char_count=char_count, lastname=lastname, sex=sex)
# 遍历生成器并输出姓名
    print("生成的姓名如下:")
    for name in generator:
        print(name)
        xx = input("请输入名字(如果不想解释可以ENTER):")
    for x in xx:
        tmp = str()
        while ( len(tmp) < 100 ) :
            分支 = random.randint(0,100)
            if 分支 < 5:
                tmp += 另起一段()
            elif 分支 < 20 :
                tmp += 来点名人名言()
            else:
                tmp += next(下一句古诗词)
        tmp = tmp.replace("x",xx)
        print(tmp)
        while True:  
            satisfaction = input(f"您是否满意这个名字和这段文本?(是/否):")  
            if satisfaction.lower() == '':  
               print("感谢您的反馈!")  
               return True  
            elif satisfaction.lower() == '':  
               print("好的,您可以重新查询并生成。")
               return False  
            else:  
               print("请输入'是'或'否'。")  
 
 # 调用函数
ask_for_name_generation()

 

 

posted @ 2024-05-22 18:46  艾鑫4646  阅读(10)  评论(0编辑  收藏  举报